Bash 스크립트는 시작된 다른 스크립트의 인스턴스 만 종료해야합니다. 잘 작동합니다. 그런 다음 calling.sh를 시작 하기 전이나

현재 상황에서 특정 스크립트 ‘calling.sh’는 백그라운드에서 다른 스크립트 ‘called.sh’를 시작하고 다른 작업을 수행하고 잠시 동안 휴면 한 다음로 ‘called.sh’를 종료합니다 pkill called.sh. 이것은 잘 작동합니다.

그런 다음 calling.sh를 시작 하기 전이나 후에 다른 시간에 다른 터미널에서 ‘called.sh’를 독립 실행 형 스크립트로 시작하고 싶습니다 . 이러한 독립 인스턴스 ‘calling.sh’에 의해 종료 되지 않아야 합니다.

어떻게하면 되나요? 직감에 따르면 호출하는 스크립트는 그 동안 실행중인 다른 이름에서 시작한 프로세스를 알 수 있어야합니다.

변형으로, ‘calling.sh’는 ‘called.sh’에 대한 심볼릭 링크 인 ‘called’를 시작할 수도 있습니다 . 위의 상황을 관리하는 것이 복잡합니까? 심볼릭 링크를 사용하려면 어떤 특정주의 사항과 조정이 필요합니까?



답변

이름을 사용하여 죽이지 마십시오. 때문에 calling.sh스크립트가 나중에 죽이고 싶어 프로세스를 호출하고, 바로 사용 $!(에서 man bash)

!
비동기 명령으로 실행하든 bg내장 명령을 사용하든 백그라운드에 가장 최근에 배치 된 작업의 프로세스 ID로 확장

따라서 다음 calling.sh과 같습니다.

called.sh &
## do stuff
pkill called.sh

이것을 다음과 같이 변경하십시오.

called.sh &
calledPid=$!
# do stuff
kill "$calledPid"

답변

나는 이것을 여러 번 선택해야했다. 복잡한 자동화 된 일정의 일부로 스크립트를 호출하면 훨씬 더 재미 있습니다. pkill죽일 스크립트를 선택하는 것과 같은 것에 의존해서는 안됩니다 .

calling.sh 안에 시작한 작업의 PID를 기록하고 PID에 의해 명시 적으로 종료해야합니다.

내부 calling.sh :

./called.sh &
called_pid=$!

# Later
kill $called_pid