Saya telah menulis skrip shell untuk memonitor direktori menggunakan utilitas inotifyt dari inotifyt-tools. Saya ingin agar skrip berjalan terus-menerus di latar belakang, tetapi saya juga ingin dapat menghentikannya saat diinginkan.
Untuk membuatnya berjalan terus menerus, saya menggunakan while true
; seperti ini:
while true;
do #a set of commands that use the inotifywait utility
end
Saya telah menyimpannya dalam file /bin
dan membuatnya dapat dieksekusi. Untuk membuatnya berjalan di latar belakang, saya menggunakan nohup <script-name> &
dan menutup terminal.
Saya tidak tahu bagaimana cara menghentikan skrip ini. Saya telah melihat jawaban di sini dan pertanyaan yang sangat terkait di sini .
UPDATE 1: Atas dasar jawaban @InfectedRoot di bawah ini, saya dapat menyelesaikan masalah saya menggunakan strategi berikut. Penggunaan pertama
ps -aux | grep script_name
dan gunakan sudo kill -9 <pid>
untuk membunuh proses. Saya kemudian harus pgrep inotifywait
dan menggunakan sudo kill -9 <pid>
lagi untuk id yang dikembalikan.
Ini berfungsi tetapi saya pikir ini adalah pendekatan yang berantakan, saya mencari jawaban yang lebih baik.
UPDATE 2: Jawabannya terdiri dari membunuh 2 proses . Ini penting karena menjalankan skrip pada baris perintah memulai 2 proses, 1 skrip itu sendiri dan 2, proses inotify .
-9
opsi darikill
dan menggunakan hanyakill
akan menghilangkan kekacauan itu.-9
opsi akan menjadi total dikill
sini. : Pkill
itu Anda awalan pgid dengan minus:kill -- -<pgid>
,kill -9 -<pgid>
, dllJawaban:
Untuk meningkatkan, menggunakan
killall
, dan juga menggabungkan perintah:Atau lakukan semuanya dalam satu baris:
sumber
Error: no process
seharusnya hanya berarti bahwa Anda sudah membunuhnya. Anda dapat mengujinya dengan membuka dua program lain, seperti VLC & Geany , dan sebagai gantinya mencobanya.grep -v grep
dengan mengubahnyagrep script_name
menjadigrep -e "[s]cript_name"
.Daftar pekerjaan latar belakang menggunakan
# jobs
Kemudian pilih jumlah pekerjaan sebelumnya dan jalankan
contoh
akan membawa ke latar depan.
Kemudian bunuh menggunakan CTRL + C atau cara yang lebih mudah untuk menemukan PID skrip menggunakan
Kemudian bunuh menggunakan pid
sumber
jobs
perintah hanya menampilkan pekerjaan yang sedang berjalan di shell. Setelah saya menutup jendela terminal tertentu, satu-satunya cara untuk mengaksesnya adalah melaluips
(lihat di atas untuk itu). Jadi sudah pasti Anda tidak mengada-ada.Anda dapat menggunakan
ps
+grep
ataupgrep
untuk mendapatkan nama proses / pid ; nanti gunakankillall
/pkill
untuk membunuh nama proses atau gunakankill
untuk membunuh pid. Semua yang berikut harus bekerja.Yang paling penting adalah Anda harus memastikan bahwa Anda hanya membunuh proses yang tepat yang ingin Anda bunuh.
pkill
Saya lebihpgrep
cocok dengan pola daripada nama pastinya , jadi lebih berbahaya; di sini-x
ditambahkan untuk mencocokkan nama yang tepat.Juga, ketika menggunakan
pgrep
/pkill
Anda mungkin perlu-f
untuk mencocokkan baris perintah penuh (sepertips aux
halnya)-a
untuk juga mencetak nama proses.sumber
pgrep
/pkill
. Jika itu masih salah Anda bisa mencobapgrep
tanpa -x. Pada dasarnya saya tidak berpikir itu baik untuk membunuh proses dalam satu perintah baris tanpa memeriksa apakah proses lain cocok.Seperti yang Anda mungkin tahu ada banyak cara untuk melakukan ini.
Mengenai "PEMBARUAN # 2" Anda - secara umum, menghentikan proses apa pun dalam hierarki orang tua-anak umumnya akan menghentikan semua proses yang terkait. Tetapi ada banyak pengecualian untuk ini. Idealnya, Anda ingin mengakhiri 'anak' terakhir di pohon proses, maka orang tua dari anak ini harus keluar jika mereka tidak memiliki tugas lain untuk dijalankan. Tetapi jika Anda membunuh orang tua, sinyal harus diteruskan ke anak-anak ketika orang tua meninggal dan anak-anak harus keluar juga - tetapi ada kasus di mana proses anak-anak dapat mengabaikan sinyal (melalui perangkap atau mekanisme serupa) dan dapat melanjutkan untuk menjalankan akan diwarisi oleh proses 'init' (atau serupa.) Tapi subjek perilaku proses ini bisa menjadi kompleks dan saya hanya akan membiarkannya di sana ...
Salah satu metode yang saya suka jika saya tidak ingin menggunakan skrip kontrol (dijelaskan selanjutnya) adalah dengan menggunakan utilitas 'layar' untuk memulai dan mengelola proses. Perintah 'layar' penuh dengan fitur dan dapat membutuhkan waktu untuk dikuasai. Saya mendorong Anda untuk membaca halaman manual 'layar' untuk penjelasan lengkap. Contoh cepat untuk memulai proses di latar belakang adalah perintah:
layar -d -m / path / ke / program
Ini akan memulai "/ path / ke / program" di dalam sesi 'layar'.
Anda dapat melihat sesi lari Anda dengan perintah:
layar -l
Dan kapan saja Anda dapat menyambung kembali ke program Anda yang sedang berjalan dengan perintah:
layar -r
Dan kemudian akhiri saja dengan ^ C atau apa pun.
Selain keindahan dari dapat terhubung kembali dan terputus dari proses Anda sesuka hati adalah 'layar' akan menangkap stdout () apa pun yang mungkin dihasilkan oleh program Anda.
Tetapi preferensi pribadi saya dalam masalah ini adalah memiliki program kontrol yang mengelola awal dan penghentian suatu proses. Ini bisa menjadi agak rumit dan memerlukan beberapa skrip yang bisa dibilang rumit. Dan seperti naskah apa pun, ada lusinan cara bagus untuk melakukannya. Saya telah memasukkan contoh bash dari metode yang saya gunakan secara rutin untuk memulai dan menghentikan aplikasi. Jika tugas Anda sederhana, Anda dapat memasukkannya langsung ke skrip kontrol - atau skrip kontrol ini memanggil program eksternal lain. Perhatikan bahwa contoh ini sama sekali tidak komprehensif dalam hal mengelola proses. Saya telah menghilangkan kemungkinan skenario seperti: Memastikan skrip belum berjalan ketika Anda menggunakan opsi "mulai", memvalidasi bahwa PID yang sedang berjalan sebenarnya adalah proses yang Anda mulai (mis. Skrip Anda belum t mati dan proses lain telah dimulai menggunakan PID yang sama), dan memvalidasi bahwa skrip benar-benar merespons (keluar) pada permintaan 'bunuh' pertama. Melakukan semua pemeriksaan ini dapat menjadi rumit dan saya tidak ingin membuat contoh terlalu panjang dan rumit. Anda mungkin ingin memodifikasi contoh untuk mempraktikkan skrip shell Anda.
Simpan kode berikut ke file yang disebut "programctl", membuatnya dapat dieksekusi dengan perintah:
chmod 755 programctl
Kemudian edit file dan tambahkan kode / skrip Anda di bagian case yang dimulai dengan "myscript".
Setelah semuanya ada, dengan asumsi "programctl" ada di direktori saat ini, Anda dapat memulai program Anda dengan:
./programctl mulai
Dan hentikan dengan:
./programctl berhenti
Bersulang.
sumber