Skrip Bash seharusnya hanya membunuh instance skrip lain yang diluncurkannya

11

Dalam situasi saat ini, skrip tertentu 'calling.sh' meluncurkan skrip lain 'dipanggil.sh' di latar belakang, melakukan operasi lain, tidur sebentar, dan kemudian mengakhiri 'dipanggil.sh' dengan a pkill called.sh. Ini berfungsi dengan baik.

Kemudian, saya juga ingin meluncurkan 'dipanggil.sh' dari terminal lain sebagai skrip mandiri di waktu lain, baik sebelum atau setelah meluncurkan calling.sh. Contoh independen ini tidak boleh dibunuh oleh 'calling.sh'.

Bagaimana saya bisa mencapai ini? Intuition mengatakan bahwa skrip panggilan harus dapat memberi tahu proses itu dimulai dari nama yang lain yang sedang berjalan saat ini.

Sebagai varian, 'calling.sh' juga dapat meluncurkan 'dipanggil' yang merupakan tautan simbolis ke 'called.sh'. Apakah ini menyulitkan dalam mengelola situasi di atas? Peringatan dan penyesuaian spesifik manakah yang membutuhkan tautan simbolis?

XavierStuvw
sumber
1
Saya percaya unshare khusus untuk ini: unix.stackexchange.com/a/450242/323121
Rusi

Jawaban:

27

Jangan gunakan nama untuk membunuhnya. Karena calling.shskrip memanggil proses yang nanti ingin Anda bunuh, cukup gunakan $!(dari man bash):

! Memperluas ID proses pekerjaan yang paling baru ditempatkan ke latar belakang, apakah dieksekusi sebagai perintah asinkron atau menggunakan bgbuiltin

Jadi, jika Anda calling.shseperti ini:

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

Ubah ke ini:

called.sh &
calledPid=$!
# do stuff
kill "$calledPid"
terdon
sumber
4
Ini seharusnya berfungsi selama dipanggil. Sh tidak mati dengan sendirinya, karena jika pidnya dapat digunakan kembali, akibatnya proses yang tidak bersalah dan tidak berhubungan tidak akan terjadi.
Eugene Ryabtsev
2
@EugeneRyabtsev itu poin yang sangat bagus. Saya kira Anda juga dapat memeriksa bahwa $calledPidPID induknya adalah PID dari called.sh.
terdon
Untuk menguatkan jawabannya, ini adalah sumber lain yang menurut saya berguna untuk mengatur pikiran saya: mywiki.wooledge.org/ProcessManagement
XavierStuvw
18

Saya harus memilih ini tetapi keluar dari skrip berkali-kali; bahkan lebih menyenangkan ketika skrip dipanggil sebagai bagian dari jadwal otomatis yang kompleks. Anda benar-benar tidak harus bergantung pada sesuatu seperti pkillmemilih skrip mana yang akan dibunuh.

Di dalam calling.sh Anda harus merekam PID dari pekerjaan yang telah Anda mulai dan bunuh secara eksplisit oleh PID.

Di dalam calling.sh:

./called.sh &
called_pid=$!

# Later
kill $called_pid
Philip Couling
sumber