Skrypt Bash powinien zabijać tylko te wystąpienia innego skryptu, który uruchomił

11

W obecnej sytuacji pewien skrypt „wywoływany.sh” uruchamia w tle inny skrypt „wywoływany.sh”, wykonuje inne operacje, śpi przez chwilę, a następnie kończy „wywoływany.sh” za pomocą pkill called.sh. To działa dobrze.

Następnie chciałbym również uruchomić skrypt „wywoływany.sh” z innych terminali jako samodzielny skrypt w dowolnym momencie, zarówno przed uruchomieniem wywołania wywołanego. Te niezależne instancje nie powinny być zabijane przez „call.sh”.

Jak mogę to osiągnąć? Intuicja mówi, że skrypt wywołujący powinien być w stanie poinformować proces, który rozpoczął, na podstawie innych uruchomionych w międzyczasie nazw.

W wariancie „call.sh” może również uruchomić „call”, który jest dowiązaniem symbolicznym do „wywoływany.sh”. Czy to komplikuje zarządzanie powyższą sytuacją? Jakie szczególne przestrogi i dostosowania wymaga użycie dowiązania symbolicznego?

XavierStuvw
źródło
1
Wierzę, że nieudostępnianie jest specjalnie do tego: unix.stackexchange.com/a/450242/323121
Rusi

Odpowiedzi:

27

Nie używaj nazwy, aby ją zabić. Ponieważ calling.shskrypt wywołuje proces, który później chcesz zabić, po prostu użyj $!(z man bash):

! Rozwija się do identyfikatora procesu zadania ostatnio umieszczonego w tle, wykonywanego jako polecenie asynchroniczne lub przy użyciu bgwbudowanego

Więc jeśli jesteś calling.shtaki:

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

Zmień to na:

called.sh &
calledPid=$!
# do stuff
kill "$calledPid"
terdon
źródło
4
Powinno to działać tak długo, jak to jest wywoływane. Sh nie umiera samo z siebie, ponieważ w przeciwnym razie jego pid może zostać ponownie użyty, zabijając w rezultacie niewinny i niezwiązany proces.
Eugene Ryabtsev,
2
@EugeneRyabtsev to bardzo dobra uwaga. Myślę, że możesz również sprawdzić, czy $calledPidnadrzędny PID to PID called.sh.
terdon
Aby wzmocnić odpowiedź, jest to kolejny zasób, który uznałem za przydatny w uporządkowaniu moich myśli: mywiki.wooledge.org/ProcessManagement
XavierStuvw
18

Tyle razy musiałem wybierać to, ale ze skryptów; jest jeszcze bardziej zabawne, gdy skrypty są wywoływane w ramach złożonego automatycznego harmonogramu. Naprawdę nie powinieneś polegać na czymś takim jak pkillwybór skryptu do zabicia.

W calling.sh powinieneś zapisać PID zadań, które rozpoczniesz i zabić je jawnie przez PID.

Połączenia wewnętrzne. Sh:

./called.sh &
called_pid=$!

# Later
kill $called_pid
Philip Couling
źródło