Ketika saya menjalankan perintah ( make
pada proyek besar) dari shell, saya bisa mengetik Ctrl-Z untuk menghentikan proses dan kembali ke shell. Selanjutnya, saya bisa lari fg
untuk melanjutkan proses.
Saya mencoba menulis skrip shell untuk mengotomatisasi ini (khususnya, untuk memeriksa suhu CPU saya setiap beberapa detik dan menghentikan proses jika terlalu panas, karena komputer saya cenderung terlalu panas). Upaya pertama saya berhasil seperti ini (disederhanakan):
make &
subpid="$!"
sleep 2
# If the CPU temperature is too high...
kill -STOP "$subpid"
sleep 2
# If the CPU temperature has dropped to safe levels...
kill -CONT "$subpid"
wait "$subpid"
Sayangnya, ini tidak berhasil; mengirim SIGSTOP ke proses tidak menghentikannya (seperti yang dibuktikan dengan terus mengirim output ke terminal). Saya berlari make &
di baris perintah, mengirim SIGSTOP, dan memeriksa status proses dengan ps
; itu terdaftar sebagai berhenti (dan mulai lagi ketika saya mengirim SIGCONT), tetapi masih memuntahkan output dan menaikkan suhu inti saya! Menghentikannya dengan Ctrl-Z tidak pernah mengalami masalah ini, tapi saya tidak tahu bagaimana melakukannya dalam sebuah skrip.
Apa yang membuat Ctrl-Z berbeda kill -STOP
, dan bagaimana saya bisa mendapatkan perilaku sebelumnya dalam skrip shell?
sumber
make
dijalankan secara rekursif. Bahkan, saya pikir itu masuk beberapa level.Jawaban:
CTRL-Z
biasanya mengirimkan SIGTSTP (yang dapat diblokir), dan - terlepas dari hal-hal lain - kerang sering mengatur ulang tty ke keadaan yang sebelumnya disimpan pada kesempatan ini. Namun yang lebih penting, grup proses terminal pengendali diatur ke PID shell (dan sekali lagi ke PID pekerjaan yang dilanjutkan denganfg
).Kembali ke masalah awal Anda: menggunakan penskalaan frekuensi yang tergantung suhu seperti misalnya Cpufreqd sebenarnya bisa menjadi palu yang lebih baik untuk kuku Anda.
sumber
Anda tidak ingin menghentikan
make
prosesnya; Anda ingin menghentikanmake
proses dan semua proses anaknya. Saya yakin make sedang dijalankan secara rekursif.Anda dapat mencoba
set -m
, kemudian gunakan%1
bukan"$subpid"
.Yang
set -m
memungkinkan "kontrol pekerjaan", yang dinonaktifkan secara default di dalam skrip. Saya pikir itu harus bekerja untuk kasus penggunaan Anda, meskipun orang tampaknya berpikir itu adalah ide yang buruk secara umum .sumber
Anda dapat mengirim sinyal ke semua proses dalam grup proses jika Anda menentukan nilai PID negatif - PGID pemimpin sesi.
Catatan: Untuk menjalankan program dalam penggunaan sesi baru
setsid make
. Tetapi dalam kasus Anda, saya pikir itu tidak diperlukan. Namun, jika make dijalankan secara rekursif, setiap instance make dapat menjadi pemimpinnya sendiri (saya tidak yakin tentang itu).Opsi lain bisa menggunakan
killall
:Perbedaan antara Ctrl + Z dan kill -STOP:
sumber
/usr/local/bin/myscript: line 38: kill: (-10202) - No such process
. Proses latar belakang terus berjalan. Saya tidak berpikirkillall
pendekatan itu akan berhasil karena beberapa subproses tampaknyash
lebih daripadamake
.make
perintah pertama , tetapi ketika saya melakukannya dari skrip, root PID berasal dari skrip shell itu sendiri .Ctrl+ Cdigunakan untuk membunuh proses dengan sinyal
SIGINT
, dengan kata lain itu adalah pembunuhan yang sopan .Ctrl+ Z digunakan untuk menunda proses dengan mengirimkannya sinyal SIGSTP , yang seperti sinyal tidur, yang dapat dibatalkan dan proses dapat dilanjutkan kembali.
Namun ketika suatu proses ditangguhkan, kita dapat melanjutkannya kembali dengan
fg
(melanjutkan di latar depan) danbg
(melanjutkan di latar belakang) , tetapi saya tidak dapat melanjutkan proses yang terbunuh, itu adalah perbedaan antara menggunakan Ctrl+ C& Ctrl+ Z.Bagaimana cara melihat proses yang ditangguhkan?
Ketika Anda memiliki beberapa perintah yang ditangguhkan, agar terdaftar, Anda menggunakan
jobs
perintah, dan hasilnya adalah:Bagaimana cara membunuh proses yang ditangguhkan di latar belakang?
Dengan menggunakan
kill
perintah:kill %n
di mana n adalah jumlah pekerjaan (yang dalam kurung persegi dari output pekerjaan), jadi saya ingin membunuh kucing:kill %1
.sumber