이름으로 쉘 스크립트 프로세스 종료

이름으로 쉘 스크립트 프로세스 종료

다음과 같이 백그라운드에서 실행되는 스크립트가 있습니다.

nohup /tmp/a.sh &

kill스크립트가 5분 이상 실행되면 좋겠습니다 .

-bash-3.2$ nohup /tmp/a.sh &
[1] 2518
-bash-3.2$ nohup: appending output to `nohup.out'

-bash-3.2$ ps -ef | grep /tmp/a.sh
ordev  2518 17827  0 15:24 pts/3    00:00:00 /bin/sh /tmp/a.sh
ordev  2525 17827  0 15:24 pts/3    00:00:00 grep /tmp/a.sh
-bash-3.2$
-bash-3.2$ killall /tmp/a.sh  # killall not working like this
/tmp/a.sh: no process killed

아래와 같이 사용 하면 killall실행 중인 모든 세션을 종료하려고 시도합니다 /bin/sh.

-bash-3.2$ killall sh /tmp/a.sh
sh(17822): Operation not permitted  # this pid associated with another process under root user. 
/tmp/a.sh: no process killed
[1]+  Terminated              nohup /tmp/a.sh .

pkill -f필요한 스크립트 이름만 제거하는 다른 방법이 있습니까 ?

답변1

시작된 프로세스의 pid를 파일에 저장합니다. 새 인스턴스를 생성하기 전에 이전 인스턴스가 완료되었는지 확인하세요. 그렇지 않으면 죽여라.

echo "Starting a new A instance"
nohup /tmp/a.sh &
echo "Writing A pid to file"
echo $! > /tmp/a_pid

그런 다음 시간을 확인하고 스크립트를 종료할 수 있습니다.

if [ -f /tmp/a_pid ]; then
    echo "Trying to stop previous instance of proces A"
    kill $(cat /tmp/a_pid) || true
    echo "Removing A pid file"
    rm /tmp/a_pid
fi

답변2

사람을 지명하고 죽일 필요가 없습니다. 스크립트를 실행할 때마다 스크립트의 PID를 저장한 다음 스크립트를 종료하려는 경우 파일에서 해당 PID를 호출하는 것이 좋습니다. 좋다:

nohup /tmp/a.sh &
echo $! > a_pid

그런 다음 종료하려면 다음을 수행하십시오.

ps -9 ` a_pid`

주의 $! 마지막 명령 실행이 주어지면 이 명령은 nohup이 됩니다.nohup /tmp/a.sh &

관련 정보