Mengakhiri skrip bash shell yang berjalan di latar belakang

16

Saya sering menggunakan bashskrip shell untuk menjalankan perintah sederhana untuk banyak file berbeda. Misalnya, bahwa saya memiliki berikut bashshell script, yang disebut script.sh, yang menjalankan program / perintah foopada 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 nohupsehingga 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 foosesuai "a.txt". Saya dapat mengakhiri foopanggilan itu, tetapi kemudian fookorespondensi "b.txt"dipanggil dan kemudian saya harus mengakhiri panggilan itu , dan seterusnya. Untuk puluhan atau ratusan file teks yang ditentukan dalam forloop, 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 myusernamenama 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 &?

Andrew
sumber
@ Andrew, Apakah kedua proses ini menunjukkan nohup yang disebutkan dalam perintah? .... atau Anda dapat mencoba ps-aWu Andrew dan memeriksa apakah Anda dapat menemukan satu entri panjang dengan nohup .... apakah ini membantu?
nitin
2
Selain itu, kutipan Anda aneh. for s in a b c; do foo "$s".txt; done
tripleee
1
@NSD: Tidak, itu nohupakan lama hilang pada saat Anda membuka daftar proses untuk melihat pekerjaan yang Anda mulai. Anda dapat melihat kolom "kesenangan" di psoutput tetapi jawaban di sini lebih bermanfaat.
tripleee

Jawaban:

9

Secara default, pstidak akan menampilkan parameter yang dipanggil dengan program. Opsi -fdan -lkeduanya akan menampilkan panggilan penuh.

ps -fu username

akan menghasilkan output yang terlihat seperti:

username 23464 66.7  0.0  11400   628 pts/5    R    15:28   1:40 bash script.sh
j883376
sumber
2
Itu cukup bermanfaat, tetapi tidak membingungkan proses ganda dengan argumen yang sama.
tripleee
11

Anda memiliki dua pilihan. Karena proses Anda berjalan di latar belakang, Anda dapat menggunakannya jobsuntuk menemukannya:

nohup bash script.sh &
...
jobs
[1]+ Running    nohup bash script.sh &
kill %1
jobs
[1]+ Terminated nohup bash script.sh &

Anda juga dapat menggunakan pkilluntuk mencari tabel proses untuk pencocokan baris perintah; yaitu:

pkill -f script.sh
JRFerguson
sumber
1

The pskeluaran (dengan misalnya ps aux) termasuk ID proses orangtua. Bunuh orang tua bash, dan anak-anaknya juga akan diberhentikan.

Untuk visualisasi ASCII dari pohon proses, coba pstree -pdengan beberapa proses latar belakang yang sedang berjalan.

tripleee
sumber