여러 백그라운드 프로세스에 대한 식별자를 설정하는 방법은 무엇입니까?

여러 백그라운드 프로세스에 대한 식별자를 설정하는 방법은 무엇입니까?

저는 사용자 지정 게임 서버를 만들고 있으며 이를 실행할 .jar 파일이 있습니다. 단일 가상 머신(예: 15개)에서 여러 게임 서버를 시작해야 합니다. 나는 다음과 같이 실행할 수 있다는 것을 발견했습니다.

java -jar server-1.0.jar &

그런데 이것을 입력하면 , , 및 만 ps표시됩니다 . 서버 6, 서버 9 등을 어떻게 식별합니까? 무엇을 사용해야 합니까?PIDCMDTTYTIME

답변1

pid백그라운드 작업을 시작하자마자 다음을 기록해 둘 수 있습니다.

command & pid1=$!
command & pid2=$!

$!마지막으로 시작된 백그라운드 작업의 pid입니다.

스크립트나 프로그램의 프로세스 속성을 통해 pid를 검색하는 도구를 사용하는 것은 현명하지 않습니다.

프로세스는 항상 자식을 추적해야 합니다. ps/... 경로를 따라가면 무고한 pgrep피해자(= 자신의 것이 아니지만 실수로 쿼리와 일치하는 프로세스)를 종료(= 신호)할 위험이 있습니다.


올바른 PID를 대상으로 지정했지만 해당 PID가 자녀가 아닌 경우에도 이러한 위험이 발생할 수 있습니다. 슬롯 pid은 프로세스가 종료되고 그 부모가 wait그 프로세스에 있을 때까지 예약됩니다(부모만 wait프로세스에 있을 수 있음). a가 귀하의 것이 아닌 경우, 귀하가 a에 대해 알게 된 시점과 신호를 보내는 시점 사이에 a가 죽어서 기다리고 있을 수 있습니다 pid. pid그러면 무고한 피해자(경쟁 조건)를 표적으로 삼을 수도 있습니다.

답변2

예를 들어 -f스위치를 사용하여 ps더 많은 정보를 표시합니다. 바라보다 man ps:

-f 완전한 형식의 목록을 만드세요. 이 옵션은 다른 많은 UNIX 스타일 옵션과 함께 사용하여 추가 열을 추가할 수 있습니다. 이는 또한 다음과 같은 결과를 가져왔습니다. 인쇄할 명령 매개변수. 와 함께 사용하면 -LNLWP(스레드 수) 및 LWP(스레드 ID) 열이 추가됩니다. c 옵션, 형식 키워드 인수 및 형식 키워드 통신을 참조하세요 .

관련 정보