Nasıl bash gibi süreçleri askıya almak ve devam ettirmek için


13

bu soru aşağıdakilerin bir takipçisidir: Süreçlerin askıya alınması ve sürdürülmesi

Gnome terminalindeki bir bash oturumundan firefox'u başlattım.

İşlem ağacı şöyle görünür:

$ 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

CTRL+ZBash'a vurduğumda , firefox'u askıya alacak. Komutu verdiğimde bg(veya fg) firefox'a devam edecek. Bu beklendiği gibi.

Komutu kill -s SIGTSTP 27980başka bir terminalde yayınladığımda, [1]+ Stopped firefoxilk terminaldeki satırı yazdırır (tıpkı vurduğumda olduğu gibi CTRL+Z), ancak firefox'u askıya almaz. Sadece kabuk betiğini askıya aldığını varsayıyorum.

kill -s SIGTSTP 27989Başka bir terminalde komutu verdiğimde (PID'ye dikkat edin), firefox'u askıya alacaktır. İlk terminal bunu dikkate almaz.

Bash tüm süreç ağacını nasıl askıya alır? sadece ağacı ve SIGTSTP'yi tüm çocukları mı geçiyor?



@Geekosaur'un bahsettiği süreç gruplarını görmek pgidiçin pskomutunuza eklemelisiniz .
ninjalj

Yanıtlar:


17

Shell işleri "süreç grupları" nda yaşar; PGRPGenişletilmiş psçıktıdaki sütuna bakın . Bunlar hem iş kontrolü için hem de bir terminalin (gerçek veya pty) kimin "sahibi" olduğunu belirlemek için kullanılır.

POSIX (Sistem V'den alınmıştır), süreç grubu grubundaki ilk işlemle ("işlem grubu lideri") tanımlandığından, bir işlem grubunu belirtmek için negatif bir işlem kimliği kullanır. Böylece pssüreç grubunu belirlemek için kullanabilirsiniz kill -s TSTP "-$pgrp". (Deneyin ps -u"$USER" -opid,ppid,pgrp,cmd.)

İşlem ağacınızda, işlem grubu başlatılan firefoxkomut dosyasıyla başlar bash, bu nedenle işlem grubu 27980 olur ve komut da olur kill -s TSTP -27980.

Doğal olarak, süreç grubunu sürdürmek için sorun kill -s CONT -- -27980.


7
Bu arada, bashyapmıyor SIGTSTPyazarken ^Z; çünkü firefoxbireyin işlem grubu terminalin geçerli işlem grubu, uç sürücü (ukalalıkla, satır disiplin) gönderir SIGTSTPbu işlem grubundaki tüm işlemlere. bashsadece waitpid()(ve diğer işler) üzerinde çalışıyor. Diğer terminal sinyalleri gibi ^Cve ^\ aynı şekilde çalışır. (meta: SE o ctrl-ters eğik
çizgiden
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.