Saya mencoba untuk melepaskan proses dari skrip bash sehingga SIGINT tidak akan diteruskan ke proses ketika saya keluar dari skrip.
Saya telah menggunakan disown
perintah di terminal secara langsung, namun dalam bash, disown
tidak menghentikan SIGINT agar tidak diteruskan. Tujuan dari skrip ini adalah untuk memulai openocd dan kemudian gdb dengan doa tunggal. Karena skrip tidak pernah keluar (itu menjalankan gdb) SIGINT masih diteruskan dari gdb ke openocd yang merupakan masalah karena SIGINT digunakan sebagai perintah berhenti di gdb.
Di terminal akan terlihat seperti ini:
$ openocd & # run openocd demonized
$ disown $! # disown last pid
$ gdb # invoke GDB
ketika dipanggil pada terminal dalam urutan ini, SIGINT tidak diteruskan dari gdb ke openocd. Namun jika doa yang sama ini dalam skrip bash, SIGINT diteruskan.
Bantuan apa pun akan sangat dihargai.
ps masalah ini ada di OS X tapi saya mencoba menggunakan alat yang juga portabel untuk semua alat Unix.
nohup
bukan jawaban yang tepat. Anda harus menambahkan beberapa pseudocode atau kode contoh untuk menunjukkan lebih tepat apa yang Anda inginkan.screen
?Jawaban:
Untuk melepaskan proses dari skrip bash:
Jika Anda menghentikan skrip bash Anda dengan
SIGINT
(ctrl + c), atau shell keluar dari pengirimanSIGHUP
misalnya, prosesnya tidak akan terganggu dan akan melanjutkan eksekusi secara normal.stdout
&stderr
Akan diarahkan ke sebuah file log:nohup.out
.Jika Anda ingin mengeksekusi perintah yang terpisah sementara dapat melihat output di terminal, maka gunakan
tail
:sumber
nohup
necassary? Apa perbedaan antaranohup COMMAND &
danCOMMAND &
jika tujuan Anda hanya menjalankan perintah di latar belakang dan membebaskan terminal?Bagi saya ini berfungsi dengan baik dengan disown
sumber
Solusi yang saya temukan melibatkan sebuah program yang disebut 'detach' yang ditulis oleh Annon Inglorion dan dapat diunduh dari situs webnya
Setelah dikompilasi, dapat digunakan dalam skrip sebagai berikut:
Baris pertama ini menciptakan proses baru (menjalankan openocd) dan menyimpan id proses dalam file (debug.pid) untuk digunakan nanti. Ini mencegah masalah dengan menangkap pid seperti yang disediakan dalam jawaban Oliver. Setelah keluar dari program pemblokiran berikutnya (gdb) file yang menyimpan pid digunakan untuk membunuh proses yang terlepas secara langsung.
sumber
detach
membuat keajaiban.solusi sederhana dan portabel:
Beberapa peringatan portabilitas:
ps
opsi tergantung pada OS! Anda malah bisa menggunakan varian dari:{ ps -ef || ps aux ;} | grep '[o]penocd | cut -f 1
.at
tidak dapat tersedia (aneh, tetapi ini terjadi ...).$(...)
membutuhkan shell yang tidak reallllly lama, jika tidak gunakan backticks.sumber
at
memulai skrip yang meluncurkan program dan memberikan pidnya sebagai gantinya dalam file, dan minta skrip utama menunggu untuk itu File muncul dan kemudian membaca pid dari itu.