Bash 스크립트는 자신이 시작한 다른 스크립트의 인스턴스만 종료해야 합니다.

Bash 스크립트는 자신이 시작한 다른 스크립트의 인스턴스만 종료해야 합니다.

현재의 경우 특정 스크립트 "calling.sh"는 백그라운드에서 다른 스크립트 "calling.sh"를 시작하고 다른 작업을 수행하고 잠시 잠자기 상태가 된 다음 pkill called.sh... 이것은 훌륭하게 작동합니다.

그런 다음 다른 터미널에서도 "called.sh"를 실행하고 싶습니다.독립형 스크립트로Calling.sh를 시작하기 전이나 후에 언제든지 가능합니다. 이러한 독립적인 인스턴스해서는 안 된다"calling.sh"에 의해 종료되었습니다.

이 목표를 어떻게 달성할 수 있나요? 직관에 따르면 호출 스크립트는 자신이 시작하는 프로세스와 동시에 실행되는 동일한 이름의 다른 프로세스를 구별할 수 있어야 합니다.

변형으로 "calling.sh"는 "calling"을 시작할 수도 있습니다.심볼릭 링크"call.sh"로. 위의 상황을 관리하는 것이 복잡합니까? 심볼릭 링크를 사용하려면 어떤 구체적인 고려 사항과 조정이 필요합니까?

답변1

이 이름으로 죽이지 마세요. calling.sh스크립트가 나중에 종료하려는 프로세스를 호출하고 있으므로 $!(from man bash)을 사용하세요.

!bg비동기 명령으로 실행되거나 내장된 명령을 사용하여 가장 최근에 백그라운드에 추가된 작업의 프로세스 ID로 확장됩니다.

그래서 당신 calling.sh이 다음과 같다면 :

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

다음과 같이 변경하세요.

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

답변2

저는 이것을 스크립트에서 여러 번 선택해야 했습니다. 스크립트가 복잡한 자동화 계획의 일부로 호출될 때 훨씬 더 흥미로웠습니다. pkill종료할 스크립트를 선택하는 것과 같은 사항 에 의존해서는 안 됩니다 .

Calling.sh 내에서 시작된 작업의 PID를 기록하고 PID로 명시적으로 종료해야 합니다.

Calling.sh 내부:

./called.sh &
called_pid=$!

# Later
kill $called_pid

관련 정보