화면 명령 프로세스 ID

화면 명령 프로세스 ID

우선 내 나쁜 영어로 인해 죄송합니다. 저는 리눅스를 처음 접했습니다.

이렇게 하면 프로세스 ID를 pid 파일에 쓸 수 있습니다.

start () {
    echo -n "Starting someserver.jar: "

    java -jar /home/someserver/someserver.jar &
    echo $! > /home/hcserver/hcserver.pid
}

그리고 내가 이 명령을 사용하고 있지만 pid 파일에 쓸 수 없다는 것을 알고 있습니다.

start () {
    echo -n "Starting someserver.jar: "

    screen -S someserver java -jar /home/someserver/someserver.jar
    echo $! > /home/someserver/someserver.pid
}

어떻게 프로세스 ID를 얻거나 이 문제를 해결할 수 있나요?

편집하다:

root@server:/home/someserver# ps -ef | grep java
root      4332     1  0 22:03 ?         SCREEN -S someserver java -jar /home/someserver/someserver.jar
root      4333  4332  0 22:03 pts/0     java -jar /home/someserver/someserver.jar
root      4363  3222  0 22:04 pts/3     grep java

나는 쓰고 싶다4333프로세스 ID를 pid 파일로

답변1

귀하의 질문을 100% 이해할 수는 없지만 다음을 시도해 보세요.

$! 하위 프로세스 내부가 아닌 상위 쉘에서 작동합니다.

$! 백그라운드 프로세스용입니다. 화면은 정확히 백그라운드 프로세스가 아닙니다.

또한 screen -S는 화면을 분리하지 않습니다. 아마도 다음과 같은 화면 옵션이 더 필요할 것입니다.

screen -dmS

또한 화면 내부에서 $$ 및 $BASHPID를 시도해 볼 수도 있습니다.

다음을 사용하여 화면의 pid를 찾을 수 있습니다.

screen -list | grep someserver | cut -f1 -d'.' | sed 's/\W//g'

화면의 pid를 죽이면 화면 내부에서 실행 중인 모든 것도 죽여야 합니다.

분리된 화면의 pid가 충분하지 않다고 확신하는 경우 pgrep을 사용하여 Java 항목의 pid를 가져오십시오.

답변2

그렇다면 백그라운드에서 오랫동안 실행되는 Java 명령을 시작하는 스크립트를 화면에서 실행하는 스크립트로 바꾸려고 하시나요?

나는 실제로 화면 시도에 두 가지 문제가 있다고 생각합니다. 먼저 해당 화면 명령은 java 명령이 완료될 때까지(또는 대화형 사용자가 몇 가지 항목을 입력할 때까지) 종료/백그라운드가 아닙니다. 둘째, $!여기서는 원하는 것을 실제로 수행하지 못할 것입니다.

화면을 배경으로 적절하게 전환하려면 다음을 사용하십시오.

screen -d -m -S someserver java -jar /home/someserver/someserver.jar

콤보 -d -m는 일반적으로 시작 스크립트에 대해 원하는 분리된(백그라운드) 상태에서 화면을 시작합니다. Java 프로세스가 종료되면 자동으로 종료되고 정리됩니다.

이제 시작 시 화면 배경이 적절하게 설정되었으므로 프로세스를 제어(또는 최소한 중지)할 수 있도록 프로세스의 PID를 가져와야 합니다. 그러나 실제로 해당 PID를 캡처하는 것은 상당히 까다롭습니다. screen -ls출력 구문 분석, /proc/데이터 구문 분석 및/또는 출력 구문 분석을 조합하여 수행할 수 있다고 생각 ps하지만 까다로울 수 있습니다. 지금까지 가장 쉬운 방법은 screen그 자체를 사용하여 해당 프로세스를 제어하는 ​​것입니다. 즉, stop()루틴에서 Java 프로세스의 pid를 종료하는 대신 다음과 같이 수행하십시오.

stop () {
  echo -n "Stopping someserver.jar: "
  screen -X -S someserver quit
}

그러면 스크린 세션( -S이전에서 이미 식별한)이 제어하는 ​​모든 프로세스를 종료하고 종료하도록 지시합니다.

하위 프로세스의 프로세스 ID가 정말로 필요한 경우 다음과 같은 방법을 사용하면 됩니다.

cd /var/run/screen/S-$(whoami)
parentpid=$(ls *.someserver | cut -d. -f1)
pid=$(ps --ppid $parentpid -ho pid)

관련 정보