Mengutip dokumentasi bash (dari man bash
):
JOB CONTROL
Job control refers to the ability to selectively stop
(suspend) the execution of processes and continue (resume)
their execution at a later point. A user typically employs
this facility via an interactive interface supplied jointly
by the operating system kernel's terminal driver and bash.
Jadi, cukup sederhana mengatakan, memiliki set -m
(default untuk shell interaktif) memungkinkan seseorang untuk menggunakan built-in seperti fg
dan bg
, yang akan dinonaktifkan di bawah set +m
(default untuk shell tidak interaktif).
Tidak jelas bagi saya apa hubungan antara kontrol pekerjaan dan mematikan proses latar belakang saat keluar, tetapi saya dapat mengonfirmasi bahwa ada satu: menjalankan set -m; (sleep 10 ; touch control-on) &
akan membuat file jika seseorang keluar dari shell tepat setelah mengetik perintah itu, tetapi set +m; (sleep 10 ; touch control-off) &
tidak akan.
Saya pikir jawabannya terletak pada sisa dokumentasi untuk set -m
:
-m Monitor mode. [...] Background pro‐
cesses run in a separate process group and a line con‐
taining their exit status is printed upon their comple‐
tion.
Ini berarti bahwa pekerjaan latar belakang yang dimulai di bawah set +m
bukanlah "proses latar belakang" yang sebenarnya ("Proses latar belakang adalah pekerjaan yang ID grup prosesnya berbeda dari terminal"): mereka berbagi ID grup proses yang sama dengan shell yang memulai, alih-alih memiliki sendiri kelompok proses seperti proses latar belakang yang tepat. Ini menjelaskan perilaku yang diamati ketika shell berhenti sebelum beberapa pekerjaan latar belakangnya: jika saya mengerti dengan benar, ketika berhenti, sinyal dikirim ke proses dalam kelompok proses yang sama dengan shell (sehingga membunuh pekerjaan latar belakang dimulai di bawah set +m
), tetapi tidak untuk orang-orang dari kelompok proses lain (sehingga meninggalkan proses latar belakang sejati dimulai di bawah set -m
).
Jadi, dalam kasus Anda, startup.sh
skrip mungkin memulai pekerjaan latar belakang. Ketika skrip ini dijalankan secara non-interaktif, seperti di atas SSH seperti dalam pertanyaan yang Anda tautkan, kontrol pekerjaan dinonaktifkan, pekerjaan "latar belakang" membagikan grup proses dari shell jauh, dan dengan demikian terbunuh segera setelah shell keluar. Sebaliknya, dengan mengaktifkan kontrol pekerjaan di shell itu, pekerjaan latar belakang memperoleh grup prosesnya sendiri, dan tidak terbunuh ketika shell induknya keluar.
tomcat/bin/startup.sh
hubungannya denganfg
/bg
?Saya menemukan ini di daftar masalah github, dan saya pikir ini benar-benar menjawab pertanyaan Anda.
Dari https://github.com/fabric/fabric/issues/395
sumber