Terkadang saya ingin memulai suatu proses dan melupakannya. Jika saya memulainya dari baris perintah, seperti ini:
redshift
Saya tidak bisa menutup terminal, atau itu akan mematikan prosesnya. Bisakah saya menjalankan perintah sedemikian rupa sehingga saya bisa menutup terminal tanpa membunuh prosesnya?
yourExecutable &
dan output terus muncul di layar danCtrl+C
tampaknya tidak menghentikan apa pun, ketik saja secara membabi butadisown;
dan tekanEnter
bahkan jika layar bergulir dengan output dan Anda tidak dapat melihat apa Anda sedang mengetik. Proses ini akan ditolak dan Anda akan dapat menutup terminal tanpa proses sekarat.Jawaban:
Salah satu dari 2 berikut ini harus berfungsi:
atau
Lihat berikut ini untuk informasi lebih lanjut tentang cara kerjanya:
man nohup
help disown
Perbedaan antara nohup, disown & & (pastikan untuk membaca komentar juga)
sumber
redshift & disown
) bekerja untuk saya di Ubuntu 10.10. Tampaknya bekerja dengan baik menempatkan semuanya pada satu baris. Apakah ada alasan saya tidak boleh melakukan ini?nohup redshift &
jadi latar belakang). Dan menempatkan yang kedua pada satu baris tidak masalah, meskipun biasanya Anda berpisah dengan;
(redshift &; disown
);
dan&
pemisah perintah dan memiliki prioritas yang sama. Satu-satunya perbedaan adalah eksekusi sinkron versus asinkron (masing-masing). Tidak perlu menggunakan&;
preferensi untuk adil&
(berfungsi, tetapi agak berlebihan).redshift &!
akan menolak redshift segera.Jika program Anda sudah berjalan, Anda dapat menjeda dengan
Ctrl-Z
, tarik ke latar belakang denganbg
dan kemudiandisown
, seperti ini:sumber
disown
tidak memutuskan stdout atau stderr. Namunnohup
demikian, seperti halnya>/dev/null
(putuskan standar keluar),2>/dev/null
(putuskan kesalahan standar). Ini (disown
) memutuskan kontrol-pekerjaan.Jawaban yang bagus sudah diposting oleh @StevenD, namun saya pikir ini mungkin akan sedikit memperjelasnya.
Alasan bahwa proses tersebut terbunuh pada terminasi terminal adalah bahwa proses yang Anda mulai adalah proses anak terminal. Setelah Anda menutup terminal, ini akan membunuh proses anak ini juga. Anda dapat melihat pohon proses dengan
pstree
, misalnya saat menjalankankate &
di Konsole:Untuk membuat
kate
proses terlepas darikonsole
saat Anda mengakhirikonsole
, gunakannohup
dengan perintah, seperti ini:Setelah ditutup
konsole
,pstree
akan terlihat seperti ini:dan
kate
akan bertahan. :)Alternatif menggunakan
screen
/tmux
/byobu
, yang akan membuat shell tetap berjalan, terlepas dari terminal.sumber
Anda dapat menjalankan proses seperti ini di terminal
setsid process
Ini akan menjalankan program dalam sesi baru. Seperti dijelaskan http://hanoo.org/index.php?article=run-program-in-new-session-linux
sumber
nohup.out
. 2) Itu tidak tetap dalam daftar pekerjaan shell Anda, sehingga tidak mengacaukan outputjobs
.Meskipun semua saran bekerja dengan baik, saya telah menemukan alternatif saya adalah menggunakan
screen
, sebuah program yang mengatur terminal virtual di layar Anda.Anda dapat mempertimbangkan memulainya dengan . Layar dapat diinstal pada hampir semua turunan Linux dan Unix. Menekan + dan (huruf kecil) akan memulai sesi kedua. Ini akan memungkinkan Anda untuk beralih antara sesi awal dengan menekan + dan atau sesi yang lebih baru dengan menekan + dan . Anda dapat memiliki hingga sepuluh sesi dalam satu terminal. Saya biasa memulai sesi di tempat kerja, pulang, ssh ke mesin kerja saya, dan kemudian memohon . Ini akan menghubungkan Anda kembali ke sesi jarak jauh itu.
screen -S session_name
CtrlACCtrlA0CtrlA1screen -d -R session_name
sumber
screen -d -m command
akan memulainya dalam layar yang sudah terlepas:~# screen -d -m top ~# screen -ls There is a screen on: 10803..Server-station (Detached) 1 Socket in /root/.screen. ~# screen -x
.... dan Anda masukCara khusus shell untuk melakukan semua ini adalah dengan menutup stdin dan latar belakang perintah:
Maka itu tidak akan berhenti ketika Anda keluar dari shell. Mengarahkan stdout adalah hal opsional yang baik untuk dilakukan.
Kerugiannya adalah Anda tidak bisa melakukan ini setelah faktanya.
sumber
Saya punya skrip untuk:
Jalankan perintah sewenang-wenang di latar belakang
Hentikan mereka agar tidak terbunuh dengan jendela terminal
Menekan output mereka
Menangani status keluar
Saya menggunakannya terutama untuk
gedit
,evince
,inkscape
dll yang semua memiliki banyak terminal output menjengkelkan. Jika perintah selesai sebelumnyaTIMEOUT
, status keluar nohup dikembalikan bukan nol.contoh ...
sumber
Aku lebih memilih:
(nama aplikasi &)
sebagai contoh:
linux@linux-desktop:~$ (chromium-browser &)
Pastikan untuk menggunakan tanda kurung saat mengetik perintah!
sumber
nohup
mencegah output tty dan saya sebenarnya hanya ingin mengarahkan output ke file dan mencegahnya jadi ini adalah solusi yang lebih baik untuk saya.Anda dapat mengatur proses (PID) untuk tidak menerima sinyal HUP saat keluar dan menutup sesi terminal. Gunakan perintah berikut:
sumber
Bisa dibilang mirip dengan jawaban yang ditawarkan oleh apolinsky , saya menggunakan varian on
screen
. Perintah vanilla seperti iniSesi dapat diputus dengan Ctrl ACtrl Ddan dihubungkan kembali dalam kasus sederhana dengan
screen -r
. Saya memiliki ini dibungkus dengan skrip yang disebutsession
tinggal diPATH
siap untuk akses mudah saya:Ini hanya berfungsi ketika Anda tahu sebelumnya bahwa Anda ingin memutuskan suatu program. Itu tidak menyediakan untuk program yang sudah berjalan terputus.
sumber
Demikian pula dengan jawaban lain yang diposting sebelumnya, seseorang dapat mentransfer proses yang berjalan untuk menggunakan "layar" secara retrospektif berkat reptyr dan kemudian menutup terminal. Langkah-langkahnya dijelaskan dalam posting ini . Langkah-langkah yang harus diambil adalah:
sumber