0 öldürmek aslında ne yapar? [kapalı]


22

İçinde man pagediyor ki:

kill [ -s signal | -p ] [ -a ] [ -- ] pid ...
 pid... Specify the list of processes that kill should signal.  Each pid can be one of five things:
          0      All processes in the current process group are signaled

Ve bash olarak böyle denedim:

$ man kill &
[1] 15247
$
[1]+  Stopped                 man kill
$ kill 0
$ ps
15247 pts/41   00:00:00 man

İşte 0olarak kullanılır pid. Anladığım kadarıyla, kill 0içerdiği mevcut süreçte tüm süreçleri öldürecek pid15247. Ancak bu örnekte hiçbir şey yapmadı. Nasıl kullanılacağı hakkında fikri olan var mı?


SIGTERMYaptığı sürece bir a gönderir . manKomut bunu görmezden seçmiştir.
jordanm

5
@jordanm, hayır. Etkileşimli bir kabuk tarafından başlatılan bir iş, kabuktan farklı bir işlem grubuna sahiptir. Bu şekilde kabuk onu ön plana ve arka plana koyabilir. Bkz ps -jsüreç gruplarını görmek için.
Stéphane Chazelas 11:13

1
Bu soru aslında SuperUser soruya bir kopyasıdır 0 gerçekte ne öldürür ne olacak? (bu StackOverflow'dan taşındı). StackOverflow'ta ve burada Unix.SE'dekill -0 farklı bir konu olan (göstergeye dikkat edin) hakkındaki sorulara da bakın .
Adam Katz

Yanıtlar:


27

Söylediği gibi, arayanın işlem grubunun tüm üyelerine sinyal gönderir.

İşlem grupları kabukta iş kontrolünü uygulamak için kullanılır (başka şeyler için kullanılabilirler, ancak etkileşimli kabuk işi kontrolü varlıklarının temel nedenidir).

Yazarken Ctrl-C, mevcut işlerin tüm işlemlerinin yalnızca onları başlatan değil öldürüldüğünü fark edeceksiniz . Ayrıca, bu arka plan işlerini öldürmez.

Bu süreç grupları ile elde edilir. Bir iş, kabuğun arka plan veya ön plana koyabileceği (terminalin ön plan işlem grubu olarak belirlenebilir) veya bir bütün olarak öldürdüğü bir kabuk tarafından başlatılan bir süreçler grubudur.

Sen ile işlem grubu kimliğine ve oturum kimlikleri hakkında bilgi bulabilirsiniz ps -j( jiçin Job kontrol).

PGID işlem grubunu öldürmek için $x:

kill -- "-$x"

kill 0 Arayanın işlem grubunu öldürür.

Bunu yaparsanız: /bin/kill 0kabuk, bu killkomutu çalıştırmak için yeni bir iş başlatacak kill, sadece kendini öldürecektir.

killgenellikle yerleşik bir kabuk olsa da, kabuğun killişlem grubunu öldürecektir.

Bununla birlikte, kabuk etkileşimli olduğunda, işlem gruplarını yöneten işlemdir, bu nedenle tipik olarak kabuğun işlem grubunda başka bir işlem yoktur. Kabuk tarafından başlatılan tüm işlemler, diğer işlem gruplarındadır:

$ sleep 1000 &
[1] 22746
$ ps -j
  PID  PGID   SID TTY          TIME CMD
22735 22735 22735 pts/23   00:00:00 zsh
22746 22746 22735 pts/23   00:00:00 sleep
22749 22749 22735 pts/23   00:00:00 ps

Yukarıda sleepve psiki farklı işlem grubunda, biri arka planda, biri ön planda ve kabuğun işlem grubundan farklı.

Yine de yapabilirsin:

(man kill & sleep 1; ps -j; kill 0)

Etkileşimli kabuk, bu alt kabuk için yeni bir işlem grubuna başlayacak ve hem alt kabuk hem de adam (ve çağrı cihazınız, groff… gibi bir adam tarafından başlatılan diğer komutlar) aynı işlem grubunda kill 0olacaktı , orada da çalışacaktı. ( sleepYukarıdaki çağrı cihazının başlaması için yeterli zaman vermek, böylece onu ps -jöldürmeden önce çıktıda görebiliriz ).


kill -- -$xaslında bash: kill: (-63531) - No such processbash 5.0.11 (1) 'de MacOS 10.14'te yayınlanacak diyor ancak işlemin var ve çalışıyor. pkill -Piyi çalışıyor
kyb

1
@kyb $ x, işlem kimliği değil, işlem grubu kimliği olmalıdır. ps -jSıvılar hakkında bilgi edinmek için çıktılarına bakın
Stéphane Chazelas
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.