Saya sering menggunakan bash
skrip shell untuk menjalankan perintah sederhana untuk banyak file berbeda. Misalnya, bahwa saya memiliki berikut bash
shell script, yang disebut script.sh
, yang menjalankan program / perintah foo
pada tiga file teks "a.txt"
, "b.txt"
, "c.txt"
:
#!/bin/bash
for strname in "a" "b" "c"
do
foo $strname".txt"
done
Juga, anggap itu foo $strname".txt"
lambat, sehingga pelaksanaan skrip akan memakan waktu lama (jam atau hari, misalnya). Karena itu, saya ingin menggunakan nohup
sehingga eksekusi terus berlanjut bahkan jika terminal ditutup atau terputus. Saya juga ingin skrip untuk segera pergi ke latar belakang, jadi saya akan menggunakan &
operator. Jadi saya akan menggunakan perintah berikut untuk memanggil script.sh
:
nohup bash script.sh &
Ini berfungsi dengan baik untuk menjalankan skrip di latar belakang dan tanpa hangup, tapi sekarang anggaplah saya ingin mengakhiri eksekusi di beberapa titik karena beberapa alasan. Bagaimana saya bisa melakukan ini?
Masalah yang saya temui adalah, dengan melihat top
, saya hanya melihat yang foo
sesuai "a.txt"
. Saya dapat mengakhiri foo
panggilan itu, tetapi kemudian foo
korespondensi "b.txt"
dipanggil dan kemudian saya harus mengakhiri panggilan itu , dan seterusnya. Untuk puluhan atau ratusan file teks yang ditentukan dalam for
loop, menjadi susah untuk menghentikan setiap foo
, satu per satu! Jadi entah bagaimana saya harus menghentikan skrip shell itu sendiri , bukan panggilan khusus yang dikeluarkan dari skrip shell.
Saat saya mengetik perintah
ps -u myusername
di mana myusername
nama pengguna saya, saya mendapatkan daftar proses yang saya jalankan. Tapi saya melihat dua ID proses yang berbeda disebut bash
. Bagaimana saya tahu yang mana dari proses ini, jika ada, yang sesuai dengan panggilan asli saya nohup bash script.sh &
?
for s in a b c; do foo "$s".txt; done
nohup
akan lama hilang pada saat Anda membuka daftar proses untuk melihat pekerjaan yang Anda mulai. Anda dapat melihat kolom "kesenangan" dips
output tetapi jawaban di sini lebih bermanfaat.Jawaban:
Secara default,
ps
tidak akan menampilkan parameter yang dipanggil dengan program. Opsi-f
dan-l
keduanya akan menampilkan panggilan penuh.akan menghasilkan output yang terlihat seperti:
sumber
Anda memiliki dua pilihan. Karena proses Anda berjalan di latar belakang, Anda dapat menggunakannya
jobs
untuk menemukannya:Anda juga dapat menggunakan
pkill
untuk mencari tabel proses untuk pencocokan baris perintah; yaitu:sumber
The
ps
keluaran (dengan misalnyaps aux
) termasuk ID proses orangtua. Bunuh orang tuabash
, dan anak-anaknya juga akan diberhentikan.Untuk visualisasi ASCII dari pohon proses, coba
pstree -p
dengan beberapa proses latar belakang yang sedang berjalan.sumber