복붙노트

[SCALA] 어떻게 스칼라 2.9 일에서 "scala.sys.process"는 무엇입니까?

SCALA

어떻게 스칼라 2.9 일에서 "scala.sys.process"는 무엇입니까?

난 그냥 여기에 도움이되는 뭔가가 있는지 확인하기 위해 새로운 scala.sys 및 scala.sys.process 패키지를 살펴했다. 그러나, 나는 완전히 손실입니다.

사람이 실제로 프로세스를 시작하는 방법에 대한 예제를 가지고있다?

그리고, 나에게 가장 흥미로운이다 : 당신은 프로세스를 분리 할 수 ​​있습니까?

분리 된 프로세스는 부모 프로세스 종료하고 개미의 약점 중 하나입니다 때 계속 실행됩니다.

최신 정보:

분리가 무엇인지 혼란이있을 것 같다. 나의 현재 프로젝트에서 실제 살아있는 예제를 가지고있다. Z-셸 및 TakeCommand에 한 번 한 번 :

Z-쉘 :

if ! ztcp localhost 5554; then
    echo "[ZSH] Start emulator"
    emulator                        \
    -avd    Nexus-One               \
    -no-boot-anim                   \
    1>~/Library/Logs/${PROJECT_NAME}-${0:t:r}.out   \
    2>~/Library/Logs/${PROJECT_NAME}-${0:t:r}.err   &
    disown
else
    ztcp -c "${REPLY}"
fi;

테이크 명령 :

IFF %@Connect[localhost 5554] lt 0 THEN
   ECHO [TCC] Start emulator
   DETACH emulator -avd Nexus-One -no-boot-anim
ENDIFF

두 경우는 에뮬레이터가 시작되고 스크립트가 종료 된 후에도 계속 실행됩니다, 화재이며, 잊어 버려. 물론 두 번 스크립트를 작성해야하는 낭비이다. 나는 Cygwin에서 또는 XML 구문없이 처리하는 통합 프로세스 지금 스칼라 들여다 그래서.

해결법

  1. ==============================

    1.먼저 수입 :

    먼저 수입 :

    import scala.sys.process.Process
    

    다음 ProcessBuilder를을 만들

    val pb = Process("""ipconfig.exe""")
    

    그런 다음 두 가지 옵션이 있습니다 :

    당신은 당신이 ProcessIO를 사용할 수있는 프로세스의 입력과 출력을 처리하는 경우 :

    import scala.sys.process.ProcessIO
    val pio = new ProcessIO(_ => (),
                            stdout => scala.io.Source.fromInputStream(stdout)
                              .getLines.foreach(println),
                            _ => ())
    pb.run(pio)
    
  2. ==============================

    2.나는 확신 프로세스가 명시 적으로 종료에 기다릴 필요가 있음을 고려하고, 잘 작동 분리하고있어, 당신은 표준 출력과 표준 에러를 보모 스레드를 사용합니다. 이것은 아주 기본적인이지만, 내가 사용하고있는 작업은 다음과 같습니다

    나는 확신 프로세스가 명시 적으로 종료에 기다릴 필요가 있음을 고려하고, 잘 작동 분리하고있어, 당신은 표준 출력과 표준 에러를 보모 스레드를 사용합니다. 이것은 아주 기본적인이지만, 내가 사용하고있는 작업은 다음과 같습니다

    /** Run a command, collecting the stdout, stderr and exit status */
    def run(in: String): (List[String], List[String], Int) = {
      val qb = Process(in)
      var out = List[String]()
      var err = List[String]()
    
      val exit = qb ! ProcessLogger((s) => out ::= s, (s) => err ::= s)
    
      (out.reverse, err.reverse, exit)
    }
    
  3. ==============================

    3.프로세스는 SBT에서 수입했다. 여기가 SBT에 나타나는 프로세스 라이브러리를 사용하는 방법에 대한 철저한 가이드입니다.

    프로세스는 SBT에서 수입했다. 여기가 SBT에 나타나는 프로세스 라이브러리를 사용하는 방법에 대한 철저한 가이드입니다.

    https://github.com/harrah/xsbt/wiki/Process

  4. ==============================

    4.

    import sys.process._ // Package object with implicits!
    "ls"!
    
    "/path/to/script.sh".run()
    

    당신이 무엇을 할 거 야의 대부분은 sys.process.ProcessBuilder의 특성과 관련이 있습니다. 그것을 알아.

    이 덜 장황 사용을 implicits이 있고, 그들은 패키지 개체 sys.process 통해 사용할 수 있습니다. 예제에 표시된 것처럼, 그 내용을 가져옵니다. 또한,뿐만 아니라 그 scaladoc를보십시오.

  5. ==============================

    5.문서 여기하는 경우 다음과 같은 기능을 쉽게 사용할 수 있습니다 :

    문서 여기하는 경우 다음과 같은 기능을 쉽게 사용할 수 있습니다 :

    def #<<< (command: String) (hereDoc: String) =
    {
        val process = Process (command)
        val io = new ProcessIO (
            in  => {in.write (hereDoc getBytes "UTF-8"); in.close},
            out => {scala.io.Source.fromInputStream(out).getLines.foreach(println)},
            err => {scala.io.Source.fromInputStream(err).getLines.foreach(println)})
        process run io
    }
    

    슬프게도 나는 중위 작동하게 (에 시간이 없었다) 할 수 없습니다. 제안 호출 규칙은 그러므로 :

    #<<< ("command") {"""
    Here Document data
    """}
    

    누군가가 나에게 그것을 호출 같은 더 쉘 만드는 방법에 대한 힌트를 줄 수 있다면 전화를 할 것입니다 :

    "command" #<<< """
    Here Document data
    """ !
    
  6. ==============================

    6.과정을 문서화 조금 더 나은 아마 이개월 내 목록에 두 번째였다. 당신은 내가 그것을 가진 적이 없어 사실에서 내 목록을 추론 할 수있다. 나는 대단히가 도착했을 때 그것이로 문서화로 남아 후회 그래서 내가하지 않는 대부분의 것들과는 달리,이, 나는 내가 할 것이라고 말했다 무언가이다. 검, 자신을 준비! 나는 네게 가을!

    과정을 문서화 조금 더 나은 아마 이개월 내 목록에 두 번째였다. 당신은 내가 그것을 가진 적이 없어 사실에서 내 목록을 추론 할 수있다. 나는 대단히가 도착했을 때 그것이로 문서화로 남아 후회 그래서 내가하지 않는 대부분의 것들과는 달리,이, 나는 내가 할 것이라고 말했다 무언가이다. 검, 자신을 준비! 나는 네게 가을!

  7. ==============================

    7.지금까지 대화를 이해한다면, 원래의 질문의 한 측면은 아직 응답되지 않습니다

    지금까지 대화를 이해한다면, 원래의 질문의 한 측면은 아직 응답되지 않습니다

    주요 어려움은 JVM에서 실행해야합니다 프로세스를 생성에 관여하는 모든 클래스, 그리고 그들이이 불가피 할 때 JVM 종료를 종료하는 것입니다. 그러나, 해결 방법은 간접적으로 대신 "분리"를 할 수있는 쉘을 활용하여 목표를 달성하는 것입니다. 원하는대로 gvim을 편집기, 작업에 나타납니다 출시 다음 스칼라 스크립트 :

    val cmd = List(
       "scala",
       "-e",
       """import scala.sys.process._ ; "gvim".run ; System.exit(0);"""
    )
    val proc = cmd.run
    

    그것은 그 스칼라가 PATH에있는 가정, 그리고 (불가피하게)뿐만 아니라 실행하는 JVM의 부모 프로세스를 떠나지 않습니다.

  8. from https://stackoverflow.com/questions/6013415/how-does-the-scala-sys-process-from-scala-2-9-work by cc-by-sa and MIT license