Jika saya menjalankan emacs dari shell:
$ emacs foo &
dan kemudian bunuh cangkang itu, emacs mati.
Bagaimana saya bisa menjalankan perintah sehingga tidak akan mati ketika shell mati?
Saya menemukan referensi ke nohup, tetapi itu sepertinya tidak membantu:
$ nohup emacs foo &
masih membunuh emacs ketika shell mati.
Metode yang paling dapat diandalkan tampaknya adalah:
Ini digunakan
( &)
untuk bercabang ke latar belakang, dansetsid
untuk melepaskan diri dari tty mengendalikan.Anda dapat menempatkan ini dalam fungsi shell:
Kemungkinannya adalah:
The
disown
perintah builtin:&
bertindak sebagai pemisah perintah, dandisown
akan default ke pekerjaan terbaru, sehingga ini dapat disingkat menjadi:Ganda-
fork()
:Perintah di dalam tanda kurung
(
)
dijalankan dalam proses shell terpisah.setsid
, seperti yang disarankan oleh Rich, mungkin merupakan pilihan terbaik, karena ia tidak mengatur TTY pengontrol proses dengan membuat sesi baru :Namun, ini juga sedikit tidak dapat diprediksi - ini hanya akan
fork()
menjadi latar belakang jika itu adalah pemimpin kelompok proses (yang tidak akan terjadi jikasetsid
digunakan dalamsh
skrip, misalnya; dalam kesempatan seperti itu hanya akan menjadi tahan terhadap Ctrl- C.)sumber
(exec emacs)
berhasil?(emacs)
. Jika subshell diberikan satu perintah,exec
itu tersirat, setidaknya dalam kasusbash
. Hal yang sama berlaku untukbash -c 'foo'
versusbash -c 'exec foo'
. (Namun, perhatikan bahwa emacs sendiri mungkin terlepas dari terminal; gvim, misalnya, melakukan ini. Lebih baik untuk menguji dengan program dengan perilaku yang diketahui.)Periksa pengaturan shell Anda. Anda juga dapat mencoba layar alih-alih
nohup
.sumber
screen -r
jika Anda gunakanCtrl-A Ctrl-D
untuk memutuskannya sebelum logout.screen -d -m sh -c "{do stuff } exit"
jauh lebih masuk akal.