다시 실행하려는 쉘 스크립트에 속한 백그라운드 프로세스를 종료하고 싶습니다.
이는 쉘 스크립트를 실행하기 전에 실행 중인 백그라운드 프로세스를 제거하고 싶다는 뜻입니다.동일한스크립트.
답변1
동일한 스크립트에 PID가 존재하는지 확인하세요.
스크립트 시작 부분에 다음을 추가합니다.
#!/bin/bash
script_name=${BASH_SOURCE[0]}
for pid in $(pidof -x $script_name); do
if [ $pid != $$ ]; then
kill -9 $pid
fi
done
답변2
kill -9 $(pgrep -f ${BASH_SOURCE[0]} | grep -v $$)
매우 간단합니다.
현재 실행 중인 스크립트의 모든 인스턴스를 검색하려면 pgrep을 사용하십시오.
pgrep은 pid만 반환하기 때문에 좋습니다.
그런 다음 $$를 사용하여 현재 실행 중인 pid를 파악하여 자체 종료를 방지합니다.
마지막으로 kill -9는 이전 인스턴스를 종료합니다.
답변3
나는 오래 전에 내 쉘 스크립트 중 하나에서 이 작업을 수행했습니다. 이것이 내가 하는 방법이다:
ps aux | \
grep -P ${BASH_SOURCE[0]} | \
grep -v $$ | \
grep -P "bash" | \
grep -oP "^[[:alnum:]]+\s+\d+\s" | \
grep -oP "\d+" | \
xargs kill -9
이 방법의 장점은 현재 실행 중인 스크립트 자체를 종료하지 않고 이전 인스턴스만 종료한다는 것입니다.
위의 접근 방식을 보여주는 예제 스크립트는 다음과 같습니다.
#!/bin/bash
ps aux | grep -P ${BASH_SOURCE[0]} | grep -v $$ | grep -P "bash" | grep -oP "^[[:alnum:]]+\s+\d+\s" | grep -oP "\d+"
sleep 100
이제 터미널에서 이 스크립트의 인스턴스를 실행하세요. 그런 다음 다른 터미널에서 다른 인스턴스를 실행하십시오. 이전 인스턴스는 즉시 종료되고 두 번째 인스턴스는 정상적으로 실행되는 것을 볼 수 있습니다.
답변4
$0
대신 사용할 수 있습니다 ${BASH_SOURCE[0]}
.
어떤 이유로 후자가 아무것도 반환하지 않았기 때문에 pgrep -f <filename>
대신 사용해야 했습니다 .pidof -x <filename>
또한 kill -9
여기서는 필요하지 않습니다.
따라서 결과는 다음과 같습니다(@jcbermy의 답변에서 영감을 얻음).
#!/bin/bash
for pid in $(pgrep -f $0); do
if [ $pid != $$ ]; then
kill $pid
fi
done