하나의 스크립트가 세 개의 프로세스를 실행하는 이유는 무엇입니까?

하나의 스크립트가 세 개의 프로세스를 실행하는 이유는 무엇입니까?

crontab에 다음 줄이 있습니다.

@reboot /usr/bin/teamspeak3-server_linux-amd64/ts3server_minimal_runscript.sh

재부팅하면 스크립트가 백그라운드에서 실행되지만(예: Teamspeak 3 서버 시작) 중지하는 방법을 찾고 있습니다. (이제 백그라운드에서 실행 중이므로 터미널에서 Ctrl+C를 누를 수 없습니다.) ). 포럼 게시물에 따르면 다음 명령을 사용하여 프로세스를 종료할 수 있습니다.

ps -ef | grep -i XXXX:  to find your background running process

kill OID : kill your unnecessary process

나는 그가 말한 OID가 PID를 의미한다고 생각했습니다. 그런데 이것을 제 시나리오에 적용해 보면 아래와 같이 3개의 프로세스가 실행되고 있는 것을 발견합니다.

$ps -ef | grep ts3
server     889    586  0  22:33  ?       00:00:00 /bin/sh -c /usr/bin/teamspeak3-server_linux-amd64/ts3server_minimal_runscript.sh
server     890    889  0  22:33  ?       00:00:00 /usr/bin/teamspeak3-server_linux-amd64/ts3server_minimal_runscript.sh
server     903    890  0  22:33  ?       00:00:00 ./ts3server_linux_amd64

혼란스러워요. 왜 3개의 프로세스가 실행되고 있나요? 나는 하나의 스크립트만 실행될 것으로 예상합니다(즉, 중간 줄만 상상합니다). 세 프로세스를 모두 종료하면 스크립트가 중지될 것 같지만 여기에 프로세스가 하나가 아닌 세 개가 있는 이유를 알고 싶습니다.

답변1

첫 번째 프로세스는 스크립트를 실행하는 셸입니다.

두 번째 프로세스는 스크립트의 셸 하위 프로세스입니다. 아마도 대괄호 내에서 실행되는 명령으로 인해 프로세스가 분기되기 때문일 것입니다. 예: "(date;cat)".

세 번째 프로세스는 실행하려는 실제 서버의 바이너리입니다.

서버를 종료하려면 세 번째 프로세스를 종료하세요. 이로 인해 하위 프로세스가 종료된 다음 기본 쉘 스크립트가 종료될 수 있습니다. 그러나 하위 프로세스는 서버가 종료된 후 다시 시작될 때까지 기다리는 쉘 루프일 수 있습니다. 따라서 다시 생성되지 않도록 두 번째 및 세 번째 프로세스를 종료해야 할 수도 있습니다.

백그라운드에서 실행되도록 설계된 대부분의 프로그램에는 더 나은 종료 방법이 있습니다. 예를 들어, /etc/init.d에서 시작된 데몬은 일반적으로 "start", "stop", "restart" 등과 같은 매개변수를 사용하여 스크립트를 호출하여 제어할 수 있습니다. 귀하의 서버에도 비슷한 시스템이 있을 수 있습니다.

답변2

다른 애플리케이션을 실행하기 위한 명령이 포함된 스크립트 1개를 실행하고 있으므로 3개의 프로세스가 실행되고 있습니다.

  1. Bash(스크립트 실행)
  2. 그 자체 script.
  3. 이것 app.

스크립트 내부:

root@onare:/home/onare# cat Downloads/TeamSpeak3-Client-linux_amd64/ts3client_runscript.sh 
#!/bin/bash

export KDEDIRS=
export KDEDIR=
export QTDIR=.
export QT_PLUGIN_PATH=.
export LD_LIBRARY_PATH=".:$LD_LIBRARY_PATH"

D1=$(readlink -f "$0")
D2=$(dirname "${D1}")
cd "${D2}"

if [ -e ts3client_linux_x86 ]; then
    ./ts3client_linux_x86 $@
else
    ./ts3client_linux_amd64 $@
fi

grep을 사용하여 실행 중인 모든 프로세스를 알고 싶다면 다음 명령을 사용할 수 있습니다.

pgrep ts3일치하는 모든 PID를 묻는 메시지가 표시됩니다.*ts3*

그런 다음 다음을 실행하십시오.

kill -9 $(pgrep ts3)

그러면 ts3을 실행하는 모든 PID가 종료됩니다.

봄 여름 시즌:

첨부: 목록

관련 정보