Menjalankan program di latar belakang dari terminal

136

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.                                                                        

NADA TAMBAHAN
sumber
7
nohup 'perintah' & Ini sepertinya berhasil. Ada masalah dengan ini?
OVERTONE

Jawaban:

173

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:

setsid gnome-calculator

Saya juga cukup parsial disownyang dapat digunakan untuk memisahkan proses dari pohon saat ini. Anda menggunakannya bersama dengan latar belakang ampersand:

gnome-calculator & disown

Saya juga baru belajar tentang memunculkan subkulit dengan tanda kurung. Metode sederhana ini berfungsi:

(gnome-calculator &)

Dan tentu saja ada nohupseperti yang Anda sebutkan. Saya tidak suka nohupkarena memiliki kecenderungan untuk menulis ~/nohup.outtanpa saya memintanya. Jika Anda mengandalkan itu, mungkin itu untuk Anda.

nohup gnome-calculator

Dan untuk proses jangka panjang, ada hal-hal seperti screendan 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 screentutorial, tetapi ini adalah langkah cepat sederhana:

Oli
sumber
Oli, dalam kasus DISPLAY =: 0 unity - ganti yang di atas yang akan Anda gunakan dan mengapa?
gila tentang rapi
4
@nuttyaboutnatty membungkus seluruh banyak di sesi shell sendiri: sh -c "sleep 10s && cvlc '/home/omm.ogg'" & disown. Itu cukup banyak solusi saya untuk semuanya untuk memastikan itu membayar dengan benar.
Oli
1
@ Nuttyaboutnatty Itulah yang saya maksud, tetapi Anda tidak akan berakhir dengan dua instance berjalan karena --replacemelakukan 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.
Oli
1
Sempurna, salah satu yang bekerja untuk saya adalah subshell '(gnome-calculator &)'. Saya menggunakannya untuk meluncurkan aplikasi konsol mono di latar belakang. Dengan teknik lain, aplikasi mono akan mogok secara instan.
Nikolaos Georgiou
2
Catatan untuk pengguna di masa depan : pembuatan nohup.outdapat ditekan dengan mengarahkan ulang stdout dan sterr /dev/nullseperti:nohup firefox &> /dev/null &
Sergiy Kolodyazhnyy
55

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

nm-applet &

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 exitatau 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:

nm-applet & exit
geirha
sumber
Itu luar biasa! Tidak pernah tahu itu dan Anda tampaknya menjadi satu-satunya orang yang menyebutkan ini. Jelas itu pendekatan favorit saya ketika berada di Lingkungan Desktop. Sayang sekali saya tidak bisa menambahkan lebih banyak hal; p
7hi4g0
Saya mencoba ini dengan aplikasi yang berbeda dan gagal: matlab & exitBerjalan sebagai dua perintah terpisah bekerja dengan baik:matlab & exit
MattKelly
Saya bertanya-tanya mengapa OP mengatakan menutup terminal menyebabkan program latar belakangnya crash. Saya belum pernah mencoba menutup terminal dengan tombol "x" di jendela.
user1717828
tombol x adalah kill itu tidak keluar dengan bersih, perintah keluar tidak. Anda bisa memetakan kembali tombol x ke perintah keluar ...
Tim Baker
14

Seperti yang Anda tunjukkan, Anda bisa berlari

nohup nm-applet &  

untuk mengabaikan sinyal akhir saat menutup terminal. Tidak masalah dengan itu.

desgua
sumber
Ada alternatif lain? Demi pengetahuan, bukan untuk hal lain
OVERTONE
Di wikipedia ( en.wikipedia.org/wiki/Nohup ) ada saran untuk digunakan echo command | at nowyang saya tidak dapat membuatnya berfungsi.
desgua
2
Saya ingin tahu bagaimana cara kerjanya dari UI ketika Anda mengklik dua kali ikon atau program.
OVERTONE
execmemberikan alternatif nohup <command> &untuk menjalankan proses di latar belakang dan mengembalikan prompt shell saat ini.
JSStuball
12

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

bg

untuk mengirim proses yang berjalan ke latar belakang. Isu

fg

alih-alih menempatkan proses yang berjalan kembali ke latar depan.

EDIT : Lebih detail dalam jawaban ini saya temukan nanti.

krlmlr
sumber
7

Gunakan (exec PROGRAM &> /dev/null & )untuk memungkinkan PID subkulit diambil alih oleh PROGRAM. Saya telah menguji pendekatan ini beberapa kali dengan beberapa program berbeda. Menutup terminal asli tidak memengaruhi program yang baru saja melahirkan

Demo kecil:

$ # this is before running
$ (exec firefox &> /dev/null &)
$ # and look, we still in side the terminal and can continue working
Sergiy Kolodyazhnyy
sumber
Hmmm (exec firefox)menggantung terminal sampai saya keluar dari Firefox ... dan menutup terminal MENGEJARkan shell dan subshell
kos
Saya sudah mengedit jawaban saya. Mengujinya dengan beberapa program lain. Saya belum mengamati firefox atau program lain yang menggantung terminal pengendali dalam versi ini
Sergiy Kolodyazhnyy
bekerja dengan baik untuk saya
Zanna
Saya tidak percaya bahwa menggunakan exec bash diperlukan, bisa jadi Anda membutuhkan PID untuk beberapa alasan.
marinara
2

Saya dapat merekomendasikan terminal byobu. Anda dapat dengan mudah melepaskan proses Anda dengan menekan tombol F6.

speter
sumber
1

Meskipun ada jawaban bagus di atas, saya ingin memberikan 2 sen saya tentang bagaimana saya menggunakan MATLAB di latar belakang.

sudo -b matlab

The -bbanderol 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

pengguna3342981
sumber
0

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.

Leo
sumber
2
Selamat Datang di Tanya Ubuntu! Saya sarankan untuk mengedit jawaban ini untuk meluaskannya dengan detail spesifik tentang bagaimana melakukan ini. (Lihat juga Bagaimana cara menulis jawaban yang baik? Untuk saran umum tentang jenis jawaban apa yang dianggap paling berharga di Ask Ubuntu.)
David Foerster
0

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. (Lihat kstart.cppkode sumber untuk referensi . Seperti yang Anda lihat dari sana, ia menggunakan KProcess::startDetached, dan KProcessberasal dari QProcess, dan startDetachedmemulai proses baru, dan melepaskannya.)

Serupa juga kde-openatau xdg-openatau gnome-open.

Albert
sumber
Karena ini berdiri, sepertinya lebih mirip komentar daripada jawaban. Harap edit untuk memperluas. Jangan hanya memberi satu kalimat; jelaskan mengapa Anda benar, idealnya dengan kutipan. Jawaban tanpa penjelasan dapat dihapus.
anonim2