Bagaimana cara menghentikan bash saat loop berjalan di latar belakang?

23

Saya memulai loop sementara sebagai berikut:

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

Perhatikan &.

Saya pikir ketika saya membunuh terminal, loop sementara ini akan berhenti. Tapi itu masih berjalan. Sudah berjam-jam sejak saya membunuh sesi terminal.

Bagaimana cara menghentikan loop sementara ini?

Saqib Ali
sumber

Jawaban:

38

Saya mulai

while true; do yad; sleep 60; done &

dan menutup terminal untuk mengujinya, sekarang saya mendapat masalah yang sama.

Jika Anda sudah menutup terminal, Anda sudah memulai loop

Mari kita lihat ikhtisar proses yang sedang berjalan ps fjx, baris terakhir di mesin saya baca

 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)

Anda dapat melihat yadsebagai subproses /bin/bash, jika saya menutupnya yadberubah menjadi sleep 60dalam output dari ps. Jika tampilan hierarki terlalu membingungkan, Anda juga dapat mencari hasilnya sebagai berikut 1 :

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

Baris output dimulai dengan dua angka, yang pertama adalah PPID, ID proses dari proses induk dan yang kedua adalah PID, ID dari proses itu sendiri. Itu karena yang 9411muncul di kedua baris di sini:

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

Itu adalah bashsubkulit yang ingin kita bunuh dan kita baru saja mengetahui PID-nya, jadi sekarang semua yang tersisa adalah sederhana

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

dan kulit yang menjengkelkan hilang untuk selamanya.

1 : Notasi sebagai grep "[y]ad"gantinya hanya grep yadmencegah grepproses itu sendiri muncul di daftar hasil.


Jika terminal Anda masih terbuka

bashmenyediakan variabel $!, yang "meluas ke ID proses pekerjaan yang paling baru ditempatkan di latar belakang", jadi yang berikut hanya membunuh proses terbaru di latar belakang:

kill $!

Jika ini bukan proses terbaru, cukup dapatkan daftar menjalankan pekerjaan dengan jobsbuiltin, contoh output:

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

Ada dua pekerjaan dalam daftar pekerjaan, untuk membunuh salah satu dari mereka Anda dapat mengaksesnya dengan nomor pekerjaan atau pintasan %, %+("pekerjaan saat ini") dan %-("pekerjaan sebelumnya"), misalnya untuk mematikan loop yang berjalan di latar belakang Anda bisa melakukan

kill %1  # or
kill %-

dan untuk membunuh sleep 10pekerjaan yang ditangguhkan :

kill %2  # or
kill %+  # or
kill %
pencuci mulut
sumber
5

Saya perlu mencatat bahwa ketika Anda menutup terminal tempat Anda memasukkan perintah itu, sub-perintah seharusnya sudah mati bersamaan dengan itu. Mencoba mereproduksi ini menunjukkan perilaku ini.

Sekarang, dengan asumsi bahwa Anda memang berada dalam situasi di mana ini tidak terjadi, salah satu cara untuk pergi membunuh program yang Anda jalankan di latar belakang, yang disebabkan oleh &pada akhir perintah, adalah sebagai berikut:

  1. Buka shell baru dan jalankan echo $$untuk mencatat PID (ID proses) Anda saat ini, sehingga Anda tidak membunuh sesi Anda sendiri.
  2. Identifikasi PID dari program yang Anda pikir masih berjalan; Anda dapat melakukan ini menggunakan ps -ef | grep $SHELLperintah untuk menemukan program mana yang menjalankan shell.
  3. Perhatikan kolom ke-2 dari kiri dan catat nilai numerik yang berbeda dari echo $$hasil Anda di atas; ini adalah PID yang ingin Anda bunuh.
  4. Jalankan kill -SIGTERM <pid>perintah, di mana <pid>nilai numerik yang Anda identifikasi pada langkah # 3
  5. Konfirmasikan program tidak lagi berjalan dengan mengulangi langkah # 2

Anda juga dapat memulai kembali sesi atau komputer Anda, tetapi hal di atas akan memungkinkan Anda untuk menghindarinya.

code_dredd
sumber
2
Anda juga bisa menggunakan topuntuk membunuh proses dengan menekan k, lalu memasukkan PID, lalu menekan enter dua kali.
luk3yx
-1

Ini &akan membuat terminal membuat proses baru dan menjalankan kode Anda di dalamnya. Jadi kode Anda menjadi independen dari proses terminal. Bahkan jika Anda menutup terminal, proses baru di mana kode Anda berjalan tidak akan berhenti. Jadi hapus &atau lakukan ps -aux, cari proses Anda dan bunuh kill (process id).

Dr4ke b4dass
sumber
-3

Biasanya bg untuk latar belakang fg untuk latar depan. Jika Anda menggunakan & simbol gunakan fg itu akan menampilkan program yang sedang berjalan. Tekan Ctrl + C untuk membunuh.

Ingin tahu
sumber
3
Menggunakan bg/ fgtidak akan berfungsi setelah terminal terlepas bash. Tidak dapat memasang kembali menggunakan reptyrkarena bashmemiliki proses anak ( sleep).
xiota
Dia menutup terminal karena dia akan membunuh proses itu. Jadi lain kali dia akan menggunakan fg untuk menutup program. Sederhana
Penasaran
@Curious itu lain kali. Tapi OP bertanya tentang ini .
RonJohn