Bagaimana cara menghentikan proses latar belakang?

196

Saya sudah memulai wget pada mesin jarak jauh di latar belakang menggunakan &. Tiba-tiba berhenti mengunduh. Saya ingin menghentikan prosesnya, kemudian menjalankan kembali perintah. Bagaimana saya bisa menghentikannya?

Saya belum menutup jendela shell-nya. Tapi seperti yang Anda tahu itu tidak berhenti menggunakan Ctrl+ Cdan Ctrl+ Z.

Mohammad Etemaddar
sumber

Jawaban:

256

Ada banyak cara untuk melakukannya.

Metode # 1 - ps

Anda dapat menggunakan psperintah untuk menemukan ID proses untuk proses ini dan kemudian menggunakan PID untuk mematikan proses.

Contoh

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

$ kill 1713

Metode # 2 - pgrep

Anda juga dapat menemukan ID proses menggunakan pgrep.

Contoh

$ pgrep wget
1234

$ kill 1234

Metode # 3 - pkill

Jika Anda yakin itu satu-satunya yang wgetAnda jalankan, Anda dapat menggunakan perintah pkilluntuk mematikan pekerjaan dengan nama.

Contoh

$ pkill wget

Metode # 4 - pekerjaan

Jika Anda berada di shell yang sama dari tempat Anda menjalankan pekerjaan yang sekarang berlatar belakang. Anda dapat memeriksa apakah masih berjalan menggunakan jobsperintah, dan juga membunuhnya dengan nomor tugasnya.

Contoh

Pekerjaan palsu saya sleep,.

$ sleep 100 &
[1] 4542

Temukan nomor pekerjaannya. CATATAN: nomor 4542 adalah ID proses.

$ jobs
[1]+  Running                 sleep 100 &

$ kill %1
[1]+  Terminated              sleep 100

Metode # 5 - fg

Anda dapat membawa pekerjaan latar belakang kembali ke latar depan menggunakan fgperintah.

Contoh

Pekerjaan palsu sleep,.

$ sleep 100 &
[1] 4650

Dapatkan nomor pekerjaan.

$ jobs
[1]+  Running                 sleep 100 &

Bawa pekerjaan # 1 kembali ke latar depan, dan kemudian gunakan Ctrl+ C.

$ fg 1
sleep 100
^C
$
slm
sumber
The jobstidak memiliki outputdan fg sais: -bash: fg: 1: no such job. Tetapi mengetik fgberfungsi dengan baik dan juga pkill wgetbekerja dengan baik. tapi ps -eaf|grep wgetkemudian kill <process number>dosis tidak menghentikan pekerjaan. ps: Saya menggunakan angka ketiga sebagai nomor proses .
Mohammad Etemaddar
1
@MohammadEtemaddar - gunakan angka ke-2 dari output ps. 3 # adalah id proses orang tua.
slm
1
@MohammadEtemaddar - ah, ps menemukan grep. Lakukan seperti ini: ps -eaef| grep [w]get.
slm
1
@MohammadEtemaddar - Anda juga dapat menggunakan pgrepgantinya, pgrep wget.
slm
2
@MohammadEtemaddar - maaf e ekstra adalah salah ketik. Harus dibaca ps -eaf | grep [w]get. Opsi ada di pshalaman manual. man ps.
slm
70

Dalam bash, Anda dapat menggunakan fguntuk mendapatkan pekerjaan ke latar depan dan kemudian menggunakan Ctrl+C

Atau daftar proses di latar belakang dengan jobsdan kemudian lakukan

kill %1

(dengan 1 diganti dengan angka jobsmemberi Anda)

Zelda
sumber
13

Anda juga dapat menggunakan kill $!untuk membunuh pekerjaan yang baru saja dilatar belakangi.

tek0078
sumber
Jika itu digunakan sebagai perintah seperti alias di profil bash, pastikan untuk membungkus dengan tanda kutip tunggal.
Nate Ritter
6

EDIT: Setelah di latar depan, Anda dapat Ctrl+ C, atau seperti @Zelda menyebutkan, membunuh dengan '% x' di mana 'x' adalah nomor pekerjaan akan mengirim sinyal default (kemungkinan besar SIGTERM dalam kasus Linux).

cukup ketik fguntuk membawanya ke latar depan, jika itu adalah proses terakhir yang Anda latar belakang (dengan '&').

Jika itu bukan yang terakhir, ketik: jobsdan temukan 'nomor pekerjaan', diwakili dalam '[]'. Kemudian ketikkan:

fg 2

..di mana '2' adalah nomor pekerjaan, misalnya:

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.
keju Swiss
sumber
4

Cara yang benar adalah mengetik jobslalu menggunakan nomor pekerjaan untuk membunuhnya. Untuk menggunakan pid untuk membunuhnya, Anda harus membawanya ke latar depan seperti disebutkan dalam jawaban pertama.

Coba ini

~/Desktop$ sleep 1000 &
[1] 7056

~/Desktop$ jobs

[1]+  Running  sleep 1000 &

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

Jika Anda menjalankan pekerjaan tepat setelah Anda membunuhnya, Anda akan melihat ini

Desktop$ jobs
[1]+  Terminated              sleep 1000
tmac
sumber
4

Satu hal yang saya tidak lihat di sini, yang saya temukan sangat berguna terutama ketika menguji perintah, adalah pidof. Anda dapat menggunakan pidof [command]untuk menemukan id proses dari proses yang sedang berjalan. Saya suka karena ini memungkinkan saya untuk dengan cepat menemukan id dari perintah yang saya inginkan, yang biasanya merupakan sesuatu yang saya panggil.

Setelah Anda memiliki pid, Anda bisa mematikan prosesnya. Ini memungkinkan untuk membuat skrip sederhana untuk mematikan proses hanya jika sedang berjalan.

Try431
sumber
1
Ah ini membantu saya! kill% 1 tidak berfungsi karena beberapa alasan, "kill: gagal mengurai argumen: '% 1'" dan Ctrl + C tidak berfungsi; tidak dapat menemukan proses dalam ps atau apa pun karena itu root (saya lupa saya menggunakan sudo dengannya)
mjohnsonengr
1

Contoh umum adalah stressalat. Katakanlah Anda menjalankan yang berikut ini:

$ stress -c 4 -m 4 

dan tutup jendela terminal. Prosesnya akan terus memakan sumber daya Anda dari latar belakang.

Miliknya apa yang saya lakukan:

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

pgrepdaftar PID dari proses yang dikenakan dan menyimpannya ke dalam variabel xyang kemudian digunakan oleh kill -9untuk menghentikannya.

Saptarshi Ghosh
sumber
0

dalam proses bash last stops (Ctrl-Z) Anda akan membunuh dengan:

kill %%
kill -9 %%

atau jika ingin memilih, gunakan:

jobs

kemudian:

kill %N

Suka kill %2

Sławomir Lenart
sumber