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


11

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

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

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

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


1
: 나는 공유 해제이 특별히 믿는 unix.stackexchange.com/a/450242/323121
RUSI

답변:


27

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

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

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

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

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

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

4
이것은 pid가 재사용되어 무고하고 관련없는 프로세스를 죽일 수 있기 때문에 called.sh가 스스로 죽지 않는 한 작동해야합니다.
Eugene Ryabtsev

2
@EugeneRyabtsev 아주 좋은 지적입니다. $calledPid부모의 PID가의 PID 인지 확인할 수도 있습니다 called.sh.
terdon

답변을 강화하기 위해, 이것은 내 생각을 정리하는 데 도움이되는 또 다른 리소스입니다. mywiki.wooledge.org/ProcessManagement
XavierStuvw

18

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

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

내부 calling.sh :

./called.sh &
called_pid=$!

# Later
kill $called_pid
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.