Saya menggunakan Tilda (terminal drop-down) di Ubuntu sebagai "pusat komando" saya - cukup banyak cara orang lain menggunakan GNOME Do, Quicksilver atau Launchy.
Namun, saya berjuang dengan cara sepenuhnya melepaskan proses (misalnya Firefox) dari terminal dari mana ia diluncurkan - yaitu mencegah proses anak (non-) seperti itu
- diakhiri saat menutup terminal asal
- "mencemari" terminal asal melalui STDOUT / STDERR
Misalnya, untuk memulai Vim di jendela terminal yang "tepat", saya telah mencoba skrip sederhana seperti berikut:
exec gnome-terminal -e "vim $@" &> /dev/null &
Namun, itu masih menyebabkan polusi (juga, memberikan nama file sepertinya tidak berhasil).
Jawaban:
Pertama-tama; setelah Anda memulai suatu proses, Anda dapat melatar belakanginya dengan terlebih dahulu menghentikannya (tekan Ctrl- Z) dan kemudian mengetik
bg
untuk membiarkannya melanjutkan di latar belakang. Sekarang "pekerjaan", danstdout
/stderr
/stdin
masih terhubung ke terminal Anda.Anda dapat memulai proses sebagai latar belakang segera dengan menambahkan "&" di akhir:
Untuk menjalankannya di latar yang dibungkam, gunakan ini:
Beberapa info tambahan:
nohup
adalah sebuah program yang dapat Anda gunakan untuk menjalankan aplikasi Anda sehingga stdout / stderr dapat dikirim ke file sebagai gantinya dan dengan demikian menutup skrip induk tidak akan SIGHUP anak. Namun, Anda harus memiliki pandangan ke depan untuk menggunakannya sebelum Anda memulai aplikasi. Karena caranohup
kerjanya, Anda tidak bisa hanya menerapkannya pada proses yang sedang berjalan .disown
adalah bash builtin yang menghilangkan pekerjaan shell dari daftar pekerjaan shell. Apa artinya ini pada dasarnya adalah bahwa Anda tidak dapat menggunakanfg
,bg
di atasnya lagi, tetapi yang lebih penting, ketika Anda menutup shell Anda tidak akan menggantung atau mengirimSIGHUP
ke anak itu lagi. Berbedanohup
,disown
digunakan setelah proses telah diluncurkan dan dilatar belakangi.Yang tidak bisa Anda lakukan, adalah mengubah stdout / stderr / stdin dari suatu proses setelah diluncurkan. Paling tidak dari shell. Jika Anda meluncurkan proses Anda dan memberi tahu bahwa stdout adalah terminal Anda (yang merupakan apa yang Anda lakukan secara default), maka proses itu dikonfigurasi untuk menghasilkan output ke terminal Anda. Shell Anda tidak memiliki urusan dengan penyiapan FD proses, itu murni sesuatu yang dikelola sendiri oleh proses itu. Proses itu sendiri dapat memutuskan apakah akan menutup stdout / stderr / stdin atau tidak, tetapi Anda tidak dapat menggunakan shell Anda untuk memaksanya melakukannya.
Untuk mengelola hasil proses latar belakang, Anda memiliki banyak opsi dari skrip, "nohup" mungkin menjadi yang pertama muncul di benak Anda. Tetapi untuk proses interaktif Anda mulai tetapi lupa untuk membungkam (
firefox < /dev/null &>/dev/null &
) Anda tidak bisa berbuat banyak, sungguh.Saya sarankan Anda mendapatkan GNU
screen
. Dengan layar Anda dapat menutup shell yang sedang berjalan saat output proses menjadi masalah dan membuka yang baru (^Ac
).Oh, dan omong-omong, jangan gunakan "
$@
" di mana Anda menggunakannya.$@
berarti,$1
,$2
,$3
..., yang akan mengubah perintah Anda ke:Itu mungkin bukan yang Anda inginkan karena -e hanya membutuhkan satu argumen. Gunakan
$1
untuk menunjukkan bahwa skrip Anda hanya dapat menangani satu argumen.Sangat sulit untuk mendapatkan beberapa argumen yang berfungsi dengan baik dalam skenario yang Anda berikan (dengan
gnome-terminal -e
) karena-e
hanya membutuhkan satu argumen, yang merupakan string perintah shell. Anda harus menyandikan argumen Anda menjadi satu. Cara terbaik dan paling kuat, tetapi agak kasar, adalah seperti ini:sumber
disown
, maka proses akan tetap hidup setelah Anda menutup shell karena bash tidak akan HUP lagi.$*
bukannya$@
memperbaiki masalah string terpisah sudah?reptyr
untuk ini.nohup
melepaskan proses sepenuhnya (memonemonikannya)sumber
nohup
mengabaikanSIGHUP
sinyal. Menjalankan proses secara normal. Tanpa daemonisasi.init
) jika shell keluar ... kan?Jika Anda menggunakan
bash
, coba ; lihat bash (1) .disown [jobspec]
Pendekatan lain yang bisa Anda coba adalah
at now
. Jika Anda bukan pengguna super, izin Anda untuk menggunakanat
mungkin dibatasi.sumber
at
untuk mendelegasikan eksekusi kepada orang lain, saya menyukainya! +1zsh
.disown
tampaknya tidak memiliki efek yang diinginkan dengangnome-terminal
-disown
proses ed masih terbunuh ketika terminal keluar. Saya ingin tahu mengapa / bagaimana.Membaca jawaban ini, saya mendapat kesan awal bahwa penerbitan
nohup <command> &
akan cukup. Menjalankan zsh di terminal gnome, saya menemukan itunohup <command> &
tidak mencegah shell saya membunuh proses anak saat keluar. Meskipunnohup
berguna, terutama dengan cangkang non-interaktif, itu hanya menjamin perilaku ini jika proses anak tidak mereset handler untukSIGHUP
sinyal.Dalam kasus saya,
nohup
seharusnya mencegah sinyal hangup dari mencapai aplikasi, tetapi aplikasi anak (VMWare Player dalam kasus ini) sedang meresetSIGHUP
handlernya. Akibatnya ketika terminal emulator keluar, itu masih bisa membunuh subproses Anda. Setahu saya, ini hanya dapat diselesaikan dengan memastikan bahwa proses tersebut dihapus dari tabel pekerjaan shell. Jikanohup
ditimpa dengan shell builtin, seperti yang kadang-kadang terjadi, ini mungkin cukup, namun, dalam hal itu tidak ...disown
adalah shell builtin dibash
,zsh
, danksh93
,atau
jika Anda lebih suka one-liners. Ini memiliki efek yang umumnya diinginkan untuk menghapus subproses dari tabel pekerjaan. Ini memungkinkan Anda untuk keluar dari emulator terminal tanpa menandakan proses anak sama sekali. Tidak peduli seperti apa
SIGHUP
pawang itu, ini seharusnya tidak membunuh proses anak Anda.Setelah disown, proses masih merupakan anak dari emulator terminal Anda (bermain dengan
pstree
jika Anda ingin menonton ini beraksi), tetapi setelah emulator terminal keluar, Anda harus melihatnya melekat pada proses init. Dengan kata lain, semuanya sudah sebagaimana mestinya, dan seperti yang mungkin Anda inginkan.Apa yang harus dilakukan jika shell Anda tidak mendukung
disown
? Saya sangat menganjurkan beralih ke yang melakukannya, tetapi tanpa adanya opsi itu, Anda punya beberapa pilihan.screen
dantmux
dapat memecahkan masalah ini, tetapi mereka adalah solusi yang jauh lebih berat, dan saya tidak suka menjalankannya untuk tugas yang begitu sederhana. Mereka jauh lebih cocok untuk situasi di mana Anda ingin mempertahankan tty, biasanya pada mesin jarak jauh.setopt nohup
. Ini dapat digunakan untuk menentukan bahwaSIGHUP
tidak boleh dikirim ke pekerjaan di tabel pekerjaan ketika shell keluar. Anda dapat menerapkan ini tepat sebelum keluar dari shell, atau menambahkannya ke konfigurasi shell seperti~/.zshrc
jika Anda selalu menginginkannya.tcsh
ataucsh
, yang agak mengganggu.exec()
. Ini adalah solusi yang sangat buruk, tetapi sumbernya hanya terdiri dari beberapa lusin baris. Anda kemudian dapat meneruskan perintah sebagai argumen baris perintah ke program C, dan karenanya menghindari entri khusus proses dalam tabel pekerjaan.sumber
nohup $COMMAND &
$COMMAND & disown
setsid command
Saya telah menggunakan nomor 2 untuk waktu yang sangat lama, tetapi nomor 3 juga berfungsi. Juga,
disown
memilikinohup
bendera-h
, dapat menolak semua proses dengan-a
, dan dapat menolak semua proses yang berjalan dengan-ar
.Diam dilakukan oleh
$COMMAND &>/dev/null
.Semoga ini membantu!
sumber
Saya pikir layar dapat menyelesaikan masalah Anda
sumber
di tcsh (dan mungkin di shell lain juga), Anda dapat menggunakan tanda kurung untuk melepaskan proses.
Bandingkan ini:
Untuk ini:
Ini menghapus firefox dari daftar pekerjaan, tetapi masih terikat ke terminal; jika Anda masuk ke simpul ini melalui 'ssh', mencoba keluar masih akan menggantung proses ssh.
sumber
Paling sederhana dan satu-satunya jawaban yang tepat untuk bash:
Anda tidak perlu melepaskan proses dari terminal, tetapi dari shell.
sumber
Untuk memisahkan perintah tty shell run melalui sub-shell untuk mis
(perintah)&
Ketika keluar terminal yang digunakan ditutup tetapi proses masih hidup.
periksa -
Buka terminal lain
Proses masih hidup.
sumber
Latar belakang dan latar depan pekerjaan mungkin adalah salah satu hal pertama yang harus diketahui oleh setiap sys-admin Unix.
Inilah cara melakukannya dengan bash:
sumber
Anda dapat menjalankan perintah Anda menggunakan perintah nohup, ini melepaskan proses Anda dan mengarahkan output ke file yang diberikan ... tapi saya tidak yakin itu persis apa yang Anda butuhkan ..
sumber
Coba daemon - harus tersedia dari manajer paket Anda yang ramah dan secara komprehensif berhati-hati dalam setiap cara melepaskan diri dari terminal.
sumber
Cukup tambahkan ini di bashrc / zshrc Anda:
Kemudian Anda dapat menjalankan perintah yang tidak diakui seperti ini:
sumber
Di .bashrc saya, saya memiliki fungsi-fungsi ini untuk tujuan itu:
Awali perintah dengan
dos
menjalankannya terlepas dari terminal.Fungsi ini ditulis untuk bekerja dengan
bash
danzsh
.sumber
( "$@" & disown) &> /dev/null
. Ini juga tidak masuk akal untuk digunakan1>
dan2>
, karena Anda menggunakandisown
, yang berarti Anda menggunakan bash, dan dalam bash Anda dapat dengan mudah melakukannya&>
untuk mengarahkan ulang stdout dan stderrrun_disowned
fungsionalitas di tempat lain di dotfiles saya. Anda benar tentang&>
hal itu, tentu saja.Saya telah menemukan di Mac OS X bahwa saya perlu menggunakan nohup DAN disown untuk memastikan bahwa proses anak tidak dihancurkan dengan terminal.
sumber
Saya menggunakan skrip berikut untuk melakukan ini. Ini menghentikan proses pencetakan ke terminal, lepas dengan
nohup
, dan keluar dengan status pengembalian jika perintah selesai di dalamTIMEOUT
.Contoh penggunaan:
sumber
sudo apt install ucommon-utils
pdetach command
Ini dia :)
sumber
Banyak jawaban yang disarankan menggunakan nohup . Saya lebih suka menyarankan menggunakan PM2 . Menggunakan pm2 lebih dari nohup memiliki banyak keuntungan, seperti menjaga aplikasi tetap hidup, memelihara file log untuk aplikasi dan banyak lagi fitur lainnya. Untuk lebih detail lihat ini .
Untuk menginstal pm2 Anda harus mengunduh npm . Untuk sistem berbasis Debian
dan untuk Redhat
Atau Anda dapat mengikuti instruksi ini . Setelah menginstal npm, gunakan untuk menginstal pm2
Setelah selesai, Anda dapat memulai aplikasi dengan
Untuk pemantauan proses gunakan perintah berikut:
Kelola proses menggunakan nama aplikasi atau id proses atau kelola semua proses bersama-sama:
File log dapat ditemukan di
sumber
nohup
adalah perintah POSIX standar, jadi komentar yang sama: tidak mungkin ditinggalkan. @lihat unix.com/man-page/posix/1p/nohupJika tujuan Anda adalah hanya meluncurkan aplikasi baris perintah tanpa menjaga jendela terminal, maka Anda dapat mencoba menjalankan aplikasi setelah meluncurkan terminal dengan alt-F2.
sumber