2013-01-05 4 views
3

나는 linkedin의 glu 플랫폼을 통해 배포 된 node.js 응용 프로그램을 작성하고 있습니다.java vs terminal을 통해 프로세스를 실행하는 것과 다른 점은 무엇입니까?

실행 명령은 sudo -u <user> node app.js을 호출하여 노드 사용자를 올바른 사용자로 시작합니다. 기본적으로이 명령을 문자열로 저장하고 Groovy의 exec() 명령을 호출합니다.

노드 응용 프로그램은 사용 가능한 프로세서의 개수에 따라 클러스터를 사용하지만 기본적으로 주요 정보는 정보를 얻은 다음 exec()을 통해 쉘 스크립트를 실행하는 것입니다.

때로는 쉘 스크립트에서 오류가 발생하지만 때때로 glu 아래에서이 셸 스크립트가 오류로 인해 종료 될 때 문제가 발생하지만 노드를 통해 노드 프로세스를 시작해야합니다 (sudo -u <user> node app.js). 프로세스가 시작됩니다. 벌금 및 껍질 프로세스가 제대로 정리 얻을.

동작이 어떻게 달라질 수 있습니까?

답변

4

예, 있습니다. 하나는 쉘에서 실행되고 하나는 직접 실행됩니다. 파이핑, 셸 변수, 명령 행 옵션 등과 같은 것들은 셸에서 실행하고 기본 Posix exec(3) 및 co를 통해 실행하는 경우 모두 매우 다르게 처리됩니다. (즉, 프로세스 발생하지 않습니다 자바 exec()를 사용하는 것은에서/시스템 쉘을 실행된다.) 당신은 popen의 자바 상당 bash 실행을 사용하고 인수, 또는 다른 무언가로 명령을 실행해야

이 선을 따라 csh 후자의

한 예 :

Process p = Runtime.getRuntime().exec(new String[]{"csh","-c","cat ~/myfile.txt"});

+0

그것을 몇 가지 방법을 시작한 후 프로세스의 런타임 환경을 몇 가지 더 POC의 일을하고 검사 후, 당신이있어 제안 확실히 작동합니다. 그러나 제안을 보여주는 것처럼 bash를 사용하여 프로세스를 시작한 후에도 여전히 셸 프로세스가 발견되지 않았습니다. 이 문제를 해결할 수있는 유일한 방법은 disown % 1을 사용하여 자식 프로세스가 Java 프로세스 아래에 있지 않도록하는 것입니다. 자바 프로세스가 여전히 stdout과 err 스트림을 자식 프로세스에서 가져 오는 것을 알고 있지만이 문제가 발생하지 않아야한다는 것을 이해합니다. – AgentRegEdit

관련 문제