Apa yang terjadi pada pekerjaan latar belakang setelah keluar dari shell?

9

Dari pemahaman saya, pekerjaan yang pipa mulai dari shell tertentu dan Anda dapat mengelola pekerjaan ini ( fg, bg, Ctrl-Z) dari dalam shell ini. Pekerjaan dapat terdiri dari beberapa proses / perintah.

Pertanyaan saya adalah apa yang terjadi pada pekerjaan ini ketika shell asli yang berisi keluar? Misalkan huponexit tidak diatur sehingga proses latar belakang tetap berjalan setelah shell keluar.

Misalkan saya sudah melakukan:

$ run.sh | grep 'abc' &
[1] job_id

Lalu saya keluar dari shell ini. Saya akan memasukkan shell baru dan lari jobsdan tidak melihat apa-apa dengan jelas. Tetapi saya dapat melakukan ps aux | grep run.shdan melihat proses ini berjalan dan saya juga akan melakukan ps aux | grep grepdan melihat proses untuk grep 'abc'berjalan juga.

Apakah ada cara untuk hanya mendapatkan ID pekerjaan untuk pipa penuh sehingga saya dapat membunuhnya dalam sekali jalan, atau apakah saya harus membunuh semua proses secara terpisah dari shell lain setelah saya keluar dari shell asli? (Saya sudah mencoba yang terakhir dan berhasil, tetapi sepertinya sulit untuk melacak semua proses.)

pengguna2193268
sumber

Jawaban:

7

Ketika shell keluar, itu mungkin mengirim sinyal HUP ke pekerjaan latar belakang, dan ini mungkin menyebabkan mereka keluar. Sinyal SIGHUP hanya dikirim jika shell sendiri menerima SIGHUP, yaitu hanya jika terminal hilang (misalnya karena proses emulator terminal mati) dan tidak jika Anda keluar dari shell secara normal (dengan exitbuiltin atau dengan mengetik Ctrl+ D). Lihat Dalam kasus apa SIGHUP tidak dikirim ke pekerjaan saat Anda logout? dan apakah ada varian UNIX tempat proses anak meninggal bersama orang tuanya? untuk lebih jelasnya. Dalam bash, Anda dapat mengatur huponexitopsi untuk juga mengirim SIGHUP ke pekerjaan latar belakang saat keluar normal. Di ksh, bash dan zsh, menelepondisownpada suatu pekerjaan menghapusnya dari daftar pekerjaan untuk mengirim SIGHUP ke. Suatu proses yang menerima SIGHUP dapat mengabaikan atau menangkap sinyal, dan kemudian tidak akan mati. Menggunakan nohupsaat Anda menjalankan program membuatnya kebal terhadap SIGHUP.

Jika prosesnya tidak terbunuh karena kemungkinan SIGHUP, maka proses itu masih tertinggal. Tidak ada yang tersisa untuk mengaitkannya dengan nomor pekerjaan di shell.

Proses mungkin masih mati jika mencoba mengakses terminal tetapi terminal tidak ada lagi. Itu tergantung bagaimana program bereaksi terhadap terminal yang tidak ada.

Jika pekerjaan tersebut berisi banyak proses (mis. Jalur pipa), maka semua proses ini berada dalam satu kelompok proses . Kelompok-kelompok proses diciptakan secara tepat untuk menangkap gagasan tentang pekerjaan shell yang terdiri dari beberapa proses terkait. Anda dapat melihat proses yang dikelompokkan berdasarkan grup proses dengan menampilkan ID grup proses mereka (PGID - biasanya ID proses dari proses pertama dalam grup), misalnya dengan ps ldi Linux atau sesuatu seperti ps -o pid,pgid,tty,etime,commportable.

Anda dapat membunuh semua proses dalam grup dengan memberikan argumen negatif kill. Misalnya, jika Anda telah menentukan bahwa PGID untuk pipa yang ingin Anda bunuh adalah 1234, maka Anda dapat membunuhnya

kill -TERM -1234
Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

Secara umum mereka masih berjalan, tetapi Anda harus menggunakan nohup, jika Anda lupa atau mengubah pikiran Anda, jangan gunakan.

mike@mike-laptop4:~$ sleep 500
^Z
[1]+  Stopped                 sleep 500
mike@mike-laptop4:~$ bg
[1]+ sleep 500 &
mike@mike-laptop4:~$ jobs
[1]+  Running                 sleep 500 &
mike@mike-laptop4:~$ disown %1
mike@mike-laptop4:~$ jobs
mike@mike-laptop4:~$ 
mikejonesey
sumber
dan untuk membunuh Anda dapat memeriksa bash induk dengan ps -ef - forest, jika bash memiliki fungsi latar belakang Anda mungkin perlu juga membunuh ini
mikejonesey