Saya tidak tahu apakah ini milik SO (karena itu adalah bug pengkodean) tetapi saya pikir kalian akan lebih berpengetahuan tentang seluk-beluk perangkat lunak yang digunakan (jadi mungkin bahkan U&L dapat dipertimbangkan).
Inilah skrip kode minimal (lihat suntingan untuk skrip lengkap, ada alasan saya melakukannya dengan cara ini);
#/bin/bash
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log
Yang coba dilakukan adalah menjalankan server di latar belakang, yang menghasilkan file log.
Lalu saya follow
menggunakan file log itu less +F
. Saat Anda melakukannya, untuk keluar ini Anda harus menekan ctrl+ csebelum Anda bisa menekan Q.
Apa yang terjadi adalah, ketika saya ctrl+ cdi dalam less
perintah (untuk menghentikan tailing
) itu entah bagaimana membunuh server dimulai dengan nohup
di atas! Tidak ada yang terpengaruh. Saya dapat shift+ funtuk memulai tailing log lagi (yang tidak mendapat info baru karena server terbunuh) dan jika saya menekan Qsisa skrip dijalankan secara normal.
Tahukah Anda mengapa ini terjadi? Bagaimana cara menghindarinya / hal lain yang harus saya gunakan?
PS
Program server mungkin mendengarkan ^C
, yang mungkin menjadi masalah; adakah yang bisa saya lakukan untuk menghentikannya? Seperti, ketika saya hanya menjalankannya {SERVERCOMMAND}
sendiri (dengan cara memblokir), saya dapat menekan ctrl+ c, yang tidak langsung membunuhnya; itu mencetak Received ^C signal, shutting down
(dan kemudian membunuh dirinya sendiri). Inilah yang terjadi ketika saya ^C
masuk less
(Final Received ^C signal, shutting down
ditulis ke log).
PPS
Saya sudah mencoba beberapa hal (tidak ada yang berhasil);
mencoba memutus stdin dari skrip dengan mengubah
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 & to nohup echo '' | {SERVERCOMMAND} > currentOutput.log 2>&1 & or nohup cat /dev/null/ | {SERVERCOMMAND} > currentOutput.log 2>&1 &
gunakan
stty intr ^G
untuk mengganti perintah interrupt, tetapi kemudian ctrl+ tetap gmelakukan apa yang^C
sedang dilakukan (jadi ini mungkin merupakan masalah dengan emulator terminal saya;konsole
)menempatkan
nohup
& / atauless
garis dalam tanda kurung (untuk membuatnya menjadi subkulit)menjalankan skrip
xterm
alih-alihkonsole
I think it is due to the handling within the database software, not on the shell
. Bagaimana program melakukan ini? Lalu bagaimana saya bisa menghentikannya?nohup
mencegah proses menerimaSIGHUP
sinyal sedangkan CTRL + C mengirimSIGINT
sinyal. Itu sebabnyanohup
tidak memiliki efek yang Anda harapkan.Jawaban:
Saya benar dalam berpikir bahwa itu
SIGINT
dikirim ke semua proses ketika ctrl+ c, tetapi saya konyol dalam berpikir bahwa membuat proses lain akan membawanya keluarprocess group
(lihat upaya saya diP.P.S.
).Ini , tidak hanya kasus penggunaan yang tepat, tetapi solusi yang benar.
Karena bagaimana skrip saya disusun, jawaban di sana tidak cocok dengan kata demi kata, inilah skripnya sekarang;
Server terus output ke file log setelah saya ctrl+ cdi
less
.Terima kasih atas waktu semua orang.
sumber
Sudahkah Anda mencoba mengingkari ?
atau apa pun pekerjaan Anda; disown adalah built-in shell, halaman manualnya menyatakan:
EDIT
Lucunya, konstruksi Anda berfungsi di Arch Linux saya:
Sebelum perintah ps , saya harus menggulir file out.log, lalu Ctrl+C, lalu q.
sumber
nohup
garis dalam fungsi yangdisowns
itu sendiri, tetapi itu harus sama dengannohup
. Saya tidak berpikir iniSIGHUP
masalah, karena ketika saya menghapusless
baris, skrip diakhiri dengan server masih berjalan