![Bash 스크립트는 자신이 시작한 다른 스크립트의 인스턴스만 종료해야 합니다.](https://linux55.com/image/149744/Bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94%20%EC%9E%90%EC%8B%A0%EC%9D%B4%20%EC%8B%9C%EC%9E%91%ED%95%9C%20%EB%8B%A4%EB%A5%B8%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98%20%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%EB%A7%8C%20%EC%A2%85%EB%A3%8C%ED%95%B4%EC%95%BC%20%ED%95%A9%EB%8B%88%EB%8B%A4..png)
현재의 경우 특정 스크립트 "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