동일한 Unix 스크립트를 실행하기 전에 스크립트의 이전 인스턴스를 종료하십시오.

동일한 Unix 스크립트를 실행하기 전에 스크립트의 이전 인스턴스를 종료하십시오.

다시 실행하려는 쉘 스크립트에 속한 백그라운드 프로세스를 종료하고 싶습니다.

이는 쉘 스크립트를 실행하기 전에 실행 중인 백그라운드 프로세스를 제거하고 싶다는 뜻입니다.동일한스크립트.

답변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

관련 정보