Bir arka plan işlemi nasıl sonlandırılır?


196

Uzak makinede arka planda kullanarak bir wget başlattım &. Aniden indirme durur. İşlemini sonlandırmak ve sonra komutu tekrar çalıştırmak istiyorum. Onu nasıl sonlandırabilirim?

Kabuk penceresini kapatmadım. Fakat bildiğiniz gibi, Ctrl+ Cve Ctrl+ ' yı kullanmayı bırakmaz Z.

Yanıtlar:


256

Bu konuda gitmek için birçok yol var.

Yöntem 1 - ps

psBu işlem için işlem kimliğini bulmak üzere komutu kullanabilir ve ardından işlemi öldürmek için PID'yi kullanabilirsiniz.

Örnek

$ ps -eaf | grep [w]get 
saml      1713  1709  0 Dec10 pts/0    00:00:00 wget ...

$ kill 1713

Yöntem # 2 - pgrep

İşlem kimliğini kullanarak da bulabilirsiniz pgrep.

Örnek

$ pgrep wget
1234

$ kill 1234

Yöntem # 3 - pkill

Tek wgetçalıştırdığınızın bu olduğundan eminseniz pkill, işi ada göre öldürmek için komutu kullanabilirsiniz .

Örnek

$ pkill wget

Yöntem # 4 - işler

Şu an arka plana sahip olan işi koyduğunuz yerden aynı kabuktasanız. jobsKomutu hala kullanıp kullanmadığını kontrol edebilir ve ayrıca iş numarasına göre öldürebilirsiniz.

Örnek

Sahte işim sleep.

$ sleep 100 &
[1] 4542

İş numarasını bul. NOT: 4542 numarası işlem kimliğidir.

$ jobs
[1]+  Running                 sleep 100 &

$ kill %1
[1]+  Terminated              sleep 100

Yöntem 5 - fg

fgKomutu kullanarak arka planlı bir işi ön plana getirebilirsiniz .

Örnek

Sahte iş sleep.

$ sleep 100 &
[1] 4650

İşin numarasını al.

$ jobs
[1]+  Running                 sleep 100 &

# 1 işini ön plana getirin ve sonra Ctrl+ tuşunu kullanın C.

$ fg 1
sleep 100
^C
$

jobsHiçbir sahiptir outputve fg sais: -bash: fg: 1: no such job. Ancak, yazı yazmak fgiyi çalışıyor ve aynı zamanda pkill wgetiyi çalışıyor. ama ps -eaf|grep wgetve sonra kill <process number>doz işi durdurmaz. ps: Üçüncü sayıyı işlem numarası olarak kullanıyorum .
Mohammad Etemaddar

1
@MohammadEtemaddar - çıktısından 2. sayıyı kullanın ps. 3 #, ebeveynin işlem kimliğidir.
slm

1
@MohammadEtemaddar - ah, ps grep buluyor. Bu sever misiniz: ps -eaef| grep [w]get.
slm

1
@MohammadEtemaddar - pgrepbunun yerine da kullanabilirsiniz pgrep wget.
slm

2
@MohammadEtemaddar - üzgünüm fazladan e bir yazım hatası. Okumalısınız ps -eaf | grep [w]get. Seçenekler psman sayfasındadır. man ps.
slm

70

Bash'ta fgişi ön plana çıkarmak için kullanabilirsiniz ve sonra Ctrl+C

Veya işlemi arka planda yapın jobsve sonra yapın.

kill %1

(1 tanesi jobssize verilen numara ile değiştirildi )


13

kill $!En son planlanan işi öldürmek için eşit olarak kullanabilirsiniz .


Bir bash profilindeki diğer adı gibi bir komut olarak kullanılıyorsa, tek tırnak işaretleri içine aldığınızdan emin olun.
Nate Ritter

6

EDIT: Ön planda bulunduğunda, Ctrl+ Cveya @Zelda'nın belirttiği gibi, 'x' ile '% x' ile öldürün, burada iş numarası varsayılan sinyal gönderir (Linux durumunda SIGTERM).

Sadece yazın fgbunu ( '&' ile) backgrounded son işlem ise, ön plana getirmek için.

Sonuncusu değilse, şunu yazın: jobs'[]' ile gösterilen 'iş numarasını' bulun. Sonra sadece şunu yazın:

fg 2

.. '2' nerede iş numarasıdır, örneğin:

foo@bar:~/junk/books$ jobs
[1]+  Running                 okular how_to_cook_a_turkey.pdf &
foo@bar:~/junk/books$ fg 1
okular how_to_cook_a_turkey.pdf            <- this is now in the foreground.

4

Doğru yol, yazmak için jobsiş numarasını kullanarak onu öldürmektir. Pid'i öldürmek için kullanmak için ilk cevapta belirtildiği gibi ön plana getirmeniz gerekir.

Bunu dene

~/Desktop$ sleep 1000 &
[1] 7056

~/Desktop$ jobs

[1]+  Running  sleep 1000 &

/Desktop$ kill %1  #(%1 is the job number)

Eğer öldürdükten hemen sonra işleri yaparsanız, bunu görmelisiniz.

Desktop$ jobs
[1]+  Terminated              sleep 1000

4

Burada görmediğim, özellikle komutları test ederken çok yararlı bulduğum bir şey var pidof. pidof [command]Çalışmakta olan bir işlemin işlem kimliğini bulmak için kullanabilirsiniz . Hoşuma gidiyor çünkü istediğim komutun kimliğini hızlıca bulmamı sağlıyor, bu genellikle yeni başlattığım bir şey.

Pid'i aldıktan sonra, işlemi kolayca öldürebilirsiniz. Sadece şu anda çalışıyorsa, bir süreci öldürmek için basit komut dosyaları oluşturmanıza olanak sağlar.


1
Ah bu bana yardımcı oldu! % 1 öldürme nedense işe yaramadı, "kill: argümanı ayrıştıramadı: '% 1'" ve Ctrl + C çalışmıyor; root olduğu için
ps'de

1

Yaygın bir örnek stressaraçtır. Aşağıdakileri koştuğunuzu varsayalım:

$ stress -c 4 -m 4 

ve terminal penceresini kapattı. Süreç, kaynaklarınızı arka plandan yemeye devam edecek.

Benim yaptığım şey:

$ x=`pgrep stress` ; sudo kill -9 $x 

pgrepSöz konusu işlemin PID'lerini listeler ve xdaha sonra kill -9onu sonlandırmak için kullanılan değişkende saklar .


0

bash son durdurulan işlemde (Ctrl-Z) öldürürsünüz:

kill %%
kill -9 %%

veya seçmek istiyorsanız, şunu kullanın:

jobs

sonra:

kill %N

sevmek kill %2

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.