Cara menangguhkan dan melanjutkan proses seperti yang dilakukan bash

13

pertanyaan ini merupakan tindak lanjut ke: Bagaimana cara menunda dan melanjutkan proses

Saya sudah mulai firefox dari sesi bash di gnome-terminal.

Pohon proses terlihat seperti ini:

$ ps -e -o pid,ppid,cmd -H
 1828     1   gnome-terminal
26677  1828     bash
27980 26677       /bin/sh /usr/lib/firefox-3.6.15/firefox
27985 27980         /bin/sh /usr/lib/firefox-3.6.15/run-mozilla.sh /usr/lib/firefox-3.6.15/firefox-bin
27989 27985           /usr/lib/firefox-3.6.15/firefox-bin
28012 27989             /usr/lib/firefox-3.6.15/plugin-container /usr/lib/adobe-flashplugin/libflashplayer.so 27989 plugin true

Ketika saya menekan CTRL+Zbash, itu akan menangguhkan firefox. Ketika saya mengeluarkan perintah bg(atau fg) itu akan melanjutkan firefox. Ini seperti yang diharapkan.

Ketika saya mengeluarkan perintah kill -s SIGTSTP 27980di terminal lain, itu akan mencetak baris [1]+ Stopped firefoxdi terminal pertama (seperti ketika saya menekan CTRL+Z), tetapi tidak menangguhkan firefox. Saya menganggap itu hanya menunda skrip shell.

Ketika saya mengeluarkan perintah kill -s SIGTSTP 27989(perhatikan PID) di terminal lain, itu akan menangguhkan firefox. Terminal pertama tidak mencatat hal ini.

Bagaimana bash menangguhkan seluruh pohon proses? apakah itu hanya melintasi pohon dan SIGTSTP semua anak-anak?

lesmana
sumber
2
Lihat juga Perbedaan antara kelompok proses dan pekerjaan? .
Gilles 'SANGAT berhenti menjadi jahat'
Anda harus menambahkan perintah pgidAnda psuntuk melihat proses yang dibicarakan grup @geekosaur.
ninjalj

Jawaban:

17

Pekerjaan Shell hidup dalam "kelompok proses"; lihat PGRPkolom dalam psoutput yang diperluas . Ini digunakan baik untuk kontrol pekerjaan dan untuk menentukan siapa yang "memiliki" terminal (nyata atau pty).

POSIX (diambil dari Sistem V) menggunakan ID proses negatif untuk menunjukkan grup proses, karena grup proses diidentifikasi oleh proses pertama dalam grup ("pemimpin grup proses"). Jadi, Anda akan gunakan psuntuk menentukan grup proses, lalu kill -s TSTP "-$pgrp". (Coba ps -u"$USER" -opid,ppid,pgrp,cmd.)

Di pohon proses Anda, grup proses dimulai dengan firefoxskrip diluncurkan oleh bash, jadi grup proses akan 27980 dan perintahnya akan kill -s TSTP -27980.

Tentu, untuk melanjutkan grup proses, masalah kill -s CONT -- -27980.

geekosaurus
sumber
7
By the way, bashtidak melakukan SIGTSTPsaat Anda mengetik ^Z; karena firefoxgrup proses adalah grup proses terminal saat ini, driver terminal (pedantically, line disiplin) mengirimkan SIGTSTPke semua proses dalam grup proses tersebut. bashbaru waitpid()saja (dan pekerjaan lain). Sinyal terminal lainnya, seperti ^Cdan ^\ bekerja dengan cara yang sama. (meta: SE benci ctrl-backslash ..)
geekosaur