다음과 같이 백그라운드에서 실행되는 스크립트가 있습니다.
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 &