Bagaimana cara menjalankan program di latar belakang shell, dengan kemampuan untuk menutup shell saat membiarkan program berjalan? Katakanlah UI saya mengalami masalah atau karena alasan tertentu, saya perlu mem-boot sebuah program dari jendela terminal, katakan nm-applet
:
nm-applet
Ketika dimulai, ia menempati latar depan jendela terminal.
Apakah ada cara sederhana untuk menjalankan program di latar belakang tanpa harus membiarkan terminal terbuka atau apakah ia menempati seluruh terminal?
Pada catatan itu, saya menemukan cara untuk menjalankan program dari terminal dan membuatnya memungkinkan untuk input lain, dengan menambahkan sebuah ampersand ( &
) ke perintah seperti itu:
nm-applet &
Tetapi ini tidak banyak digunakan karena setiap proses yang dimulai di terminal terbunuh begitu terminal ditutup.
sumber
Jawaban:
Saya baru-baru ini suka
setsid
. Ini dimulai tampak seperti Anda hanya menjalankan sesuatu dari terminal tetapi Anda dapat memutuskan sambungan (menutup terminal) dan terus berjalan.Ini karena perintah benar-benar membayar dan sementara input masuk ke terminal saat ini, itu dimiliki oleh orangtua yang sama sekali berbeda (yang tetap hidup setelah Anda menutup terminal).
Sebuah contoh:
Saya juga cukup parsial
disown
yang dapat digunakan untuk memisahkan proses dari pohon saat ini. Anda menggunakannya bersama dengan latar belakang ampersand:Saya juga baru belajar tentang memunculkan subkulit dengan tanda kurung. Metode sederhana ini berfungsi:
Dan tentu saja ada
nohup
seperti yang Anda sebutkan. Saya tidak sukanohup
karena memiliki kecenderungan untuk menulis~/nohup.out
tanpa saya memintanya. Jika Anda mengandalkan itu, mungkin itu untuk Anda.Dan untuk proses jangka panjang, ada hal-hal seperti
screen
dan muxer terminal virtual lainnya yang menjaga sesi tetap hidup di antara koneksi. Ini mungkin tidak benar-benar berlaku untuk Anda karena Anda hanya ingin akses sementara ke output terminal, tetapi jika Anda ingin kembali beberapa waktu kemudian dan melihat aktivitas terminal terbaru, layar mungkin akan menjadi pilihan terbaik Anda.Internet penuh dengan
screen
tutorial, tetapi ini adalah langkah cepat sederhana:sumber
sh -c "sleep 10s && cvlc '/home/omm.ogg'" & disown
. Itu cukup banyak solusi saya untuk semuanya untuk memastikan itu membayar dengan benar.--replace
melakukan apa yang terdengar seperti dan benar-benar mengakhiri contoh lama. Menjalankannya untuk kedua kalinya dari dalam sesi tersebut akan mengakhiri salinan terikat ke TTYn dan akan membiarkan Anda menggunakannya di masa depan jika Anda membutuhkannya. Mungkin ada cara yang lebih baik untuk melakukannya tetapi apa yang muncul di benak saya setiap kali saya membutuhkannya.nohup.out
dapat ditekan dengan mengarahkan ulang stdout dan sterr/dev/null
seperti:nohup firefox &> /dev/null &
Inilah dua cara yang saya gunakan. Pertama, tidak menjalankannya dari terminal; tekan Alt+ F2untuk membuka dialog run, dan jalankan dari sana (tanpa &).
Dari terminal, jalankan
Tetapi JANGAN menutup terminal sendiri. Artinya, jangan tekan tombol X untuk menutup, dan jangan gunakan File -> Exit dari menubar-nya. Jika Anda menutup terminal dengan cara itu, ia akan mengirim sinyal HUP (Hang UP) ke bash yang berjalan di dalamnya, yang pada gilirannya akan mengirimkan sinyal HUP ke semua anak-anaknya (itulah sebabnya nohup bekerja dalam kasus ini).
Sebagai gantinya, keluar dari shell dengan menjalankan
exit
atau menekan Ctrl+ D. bash kemudian akan menyangkal anak-anaknya, lalu keluar, meninggalkan proses latar belakang masih berjalan. Dan ketika bash keluar, terminal telah kehilangan proses anaknya, sehingga akan menutup juga.Melakukan semuanya sekaligus:
sumber
matlab & exit
Berjalan sebagai dua perintah terpisah bekerja dengan baik:matlab &
exit
Seperti yang Anda tunjukkan, Anda bisa berlari
untuk mengabaikan sinyal akhir saat menutup terminal. Tidak masalah dengan itu.
sumber
echo command | at now
yang saya tidak dapat membuatnya berfungsi.exec
memberikan alternatifnohup <command> &
untuk menjalankan proses di latar belakang dan mengembalikan prompt shell saat ini.Satu hal yang tidak ada jawaban lainnya adalah cara melepaskan proses yang sedang berjalan yang memblokir shell. Di sebagian besar terminal dan shell, Ctrl+ Zakan menghentikan proses yang sedang berjalan dan membawa Anda kembali ke prompt input. Lalu, Anda bisa mengeluarkan
untuk mengirim proses yang berjalan ke latar belakang. Isu
alih-alih menempatkan proses yang berjalan kembali ke latar depan.
EDIT : Lebih detail dalam jawaban ini saya temukan nanti.
sumber
Gunakan
(exec PROGRAM &> /dev/null & )
untuk memungkinkan PID subkulit diambil alih olehPROGRAM
. Saya telah menguji pendekatan ini beberapa kali dengan beberapa program berbeda. Menutup terminal asli tidak memengaruhi program yang baru saja melahirkanDemo kecil:
sumber
(exec firefox)
menggantung terminal sampai saya keluar dari Firefox ... dan menutup terminal MENGEJARkan shell dan subshellSaya dapat merekomendasikan terminal byobu. Anda dapat dengan mudah melepaskan proses Anda dengan menekan tombol F6.
sumber
Meskipun ada jawaban bagus di atas, saya ingin memberikan 2 sen saya tentang bagaimana saya menggunakan MATLAB di latar belakang.
The
-b
banderol sudo dapat menjalankan aplikasi di latar belakang. Anda juga dapat menutup terminal setelah menjalankan perintah ini.Mungkin, tidak terkait tetapi ada situs web luar biasa yang dapat Anda gunakan untuk menjelaskan perintah shell. http://explainshell.com/explain/8/sudo
sumber
Saya tidak tahu ini cara yang benar tetapi saya baru saja memulai sesi lain sambil meninggalkan semua sebelumnya. Misalnya saya menjalankan server web sederhana di raspberry saya. web.py. lalu saya memulai sesi baru sambil membiarkannya sendiri. itu dia. itu juga berguna karena Anda masih diperbarui meskipun Anda sedang bekerja di sesi lain.
sumber
Jika KDE digunakan, Anda juga dapat menggunakan
kstart
, yang akan memulai program Anda terlepas dari terminal. Ini juga memastikan bahwa lingkungan KDE diatur dengan benar untuk perintah. (Lihatkstart.cpp
kode sumber untuk referensi . Seperti yang Anda lihat dari sana, ia menggunakanKProcess::startDetached
, danKProcess
berasal dariQProcess
, danstartDetached
memulai proses baru, dan melepaskannya.)Serupa juga
kde-open
atauxdg-open
ataugnome-open
.sumber