Döngü arka planda çalışırken bir bash nasıl durdurulur?


23

Bir süre döngüsü şöyle başladım:

while true; do {command}; sleep 180; done &

Dikkat edin &.

Terminali öldürdüğümde, bu döngünün duracağını düşündüm. Ama hala gidiyor. Terminal oturumunu öldürdüğümden bu yana saatler geçti.

Döngü sırasında bunu nasıl durdurabilirim?

Yanıtlar:


38

başladım

while true; do yad; sleep 60; done &

ve test etmek için terminali kapattım, şimdi de aynı sorunu gördüm.

Terminali zaten kapattıysanız, döngüyü başlattınız.

Makinemdeki ps fjxson satırlarla çalışan işlemlere genel bir bakalım

 2226 11606 11606 19337 ?           -1 S     1000   0:00  \_ /bin/bash
11606 22485 11606 19337 ?           -1 S     1000   0:00  |   \_ sleep 10
 2226  9411  9411  8383 ?           -1 S     1000   0:00  \_ /bin/bash
 9411 17674  9411  8383 ?           -1 Sl    1000   0:00      \_ yad
    1  2215  2215  2215 ?           -1 Ss    1000   0:00 /lib/systemd/systemd --user
 2215  2216  2215  2215 ?           -1 S     1000   0:00  \_ (sd-pam)

yadBir alt işlemi olarak görebilirsiniz /bin/bash, eğer kapatırsam çıktısında yaddeğişir . Çok şöyle de çıkış arama yapabilirsiniz kafa karıştırıcı ağaç görünümü ise 1 :sleep 60ps

ps fjx | grep "[y]ad"  # or respectively
ps fjx | grep "[s]leep 60"

Çıkış hatları iki sayıyla başlar, birincisi PPID, ana işlemin işlem kimliği ve ikincisi de PID, işlemin kimliğidir. 9411Buradaki her iki sırada da görünmesi nedeniyle :

2226  9411  9411  8383 ?           -1 S     1000   0:00  \_ /bin/bash
9411 17674  9411  8383 ?           -1 Sl    1000   0:00      \_ yad

Bu bash, öldürmek istediğimiz alt kabuk ve PID'sini yeni öğrendim, yani şimdi kalan her şey basit

kill 9411  # replace 9411 with the PID you found out!

ve sinir bozucu alt kabuk iyi gitti.

1 : Bunun grep "[y]ad"yerine sadece gösterim grep yad, grepişlemin sonuç listesinde görünmesini engeller .


Terminal hala açıksa

bash$!“arka plana en son yerleştirilen işin işlem kimliğine genişleyen” değişkenini sağlar , bu nedenle aşağıdakiler arka plandaki en son işlemi öldürür:

kill $!

Bu en son işlem değilse , jobsyerleşik, örnek çıktıyla çalışan işlerin bir listesini alabilirsiniz :

[1]-  Running                 while true; do
    yad; sleep 60;
done &
[2]+  Stopped                 sleep 10

Bunlardan birini size iş numarası veya kısayolları ile erişebilirsiniz öldürmek için iş listesinde iki iş vardır %, %+( “mevcut iş”) ve %-arka planda çalışan döngü öldürmek için ( “Önceki iş”), örneğin sen yapabilirdi

kill %1  # or
kill %-

ve askıya alınmış sleep 10işi öldürmek için :

kill %2  # or
kill %+  # or
kill %

5

Bu komutu girdiğiniz terminali kapattığınızda, alt komutun bununla birlikte ölmüş olması gerektiğini not etmeliyim. Bunu yeniden üretmeye çalışmak bu davranışı gösterdi.

Şimdi, aslında bunun olmadığı bir durumda olduğunuzu varsayarak &, komutun sonunda neden olduğu arka planda çalışan bıraktığınız programı öldürmenin bir yolu şöyledir:

  1. Yeni bir kabuk açın ve echo $$mevcut PID'inizi (proses ID) not edin, böylece kendi oturumunuzu öldürmezsiniz.
  2. Hala çalıştığını düşündüğünüz programın PID'sini belirleyin; Bunu, ps -ef | grep $SHELLhangi programların bir kabuk çalıştırdığını bulmak için komutu kullanarak yapabilirsiniz .
  3. Soldan 2. sütununun ve sayısal değeri unutmayın farklıdır senin dan echo $$yukarıda sonucu; bu öldürmek istediğin PID.
  4. kill -SIGTERM <pid>Komutu çalıştırın, <pid>3. adımda tanımladığınız sayısal değer nerede
  5. Programın artık adım 2'yi tekrarlayarak çalışmadığını onaylayın

Ayrıca oturumunuzu veya bilgisayarınızı yeniden başlatabilirsiniz, ancak yukarıdakiler bundan kaçınmanıza izin verecektir.


2
Ayrıca topişlemi k, ardından PID'ye girip, ardından iki kez enter tuşuna basarak öldürmek için de kullanabilirsiniz .
luk3yx

-1

Bu &, terminalin yeni bir işlem yaratmasını ve kodunuzun içinde çalışmasını sağlar. Böylece kodunuz terminal işleminden bağımsız hale gelir. Terminali kapatsanız bile, kodunuzun çalıştığı yeni işlem durmaz. Öyleyse kaldır &ya da yap ps -aux, sürecini bul ve öldür kill (process id).


-3

Genellikle ön plan için arka plan fg için bg . Eğer & fg sembolünü kullanırsanız, o anki çalışan programı gösterir. Öldürmek için Ctrl + C tuşlarına basın .


3
Kullanılması bg/ fgterminali ayrılmış bir kez çalışmaz bash. Alt süreçleri ( ) reptyrolduğundan bash, kullanarak yeniden bağlayamazdım sleep.
xiota

Terminali kapattı çünkü bu süreci öldürecek. Bu yüzden bir dahaki sefere programı kapatmak için fg kullanacak. Basit
Meraklı

@Curious bir dahaki sefere. Fakat OP bu kez soruyor .
RonJohn
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.