Keluar dari zsh, tetapi biarkan pekerjaan yang sedang berjalan tetap terbuka?

96

Baru saja beralih dari bash ke zsh.

Dalam bash, tugas latar belakang terus berjalan saat shell keluar. Misalnya di sini, dolphinterus berjalan setelah exit:

$ dolphin .
^Z
[1]+  Stopped                 dolphin .
$ bg
[1]+ dolphin . &
$ exit

Inilah yang saya inginkan sebagai perilaku default.

Sebaliknya, perilaku zsh adalah memperingatkan tentang menjalankan pekerjaan di exit, lalu menutupnya jika Anda melakukannya exitlagi. Misalnya di sini, dolphinditutup ketika exitperintah kedua benar-benar keluar dari shell:

 % dolphin .
^Z
zsh: suspended  dolphin .
 % bg
[1]  + continued  dolphin .
 % exit
zsh: you have running jobs.
 % exit 

Bagaimana cara membuat perilaku default zsh di sini seperti bash?

Owen_R
sumber

Jawaban:

169

Mulai program dengan &!:

dolphin &!

The &!( atau ekuivalennya,&| ) adalah pintasan khusus zsh ke latar belakang dan menolak proses, sehingga keluar dari shell akan membiarkannya berjalan.

Anko
sumber
2
Untuk kelengkapan, dapatkah Anda juga mencantumkan cara menolaknya setelah sudah dimulai?
trusktr
@trusktr Ada pertanyaan berbeda tentang menyangkal proses latar depan . Saya pikir sebaiknya dipisahkan untuk kejelasan. Untuk siapa pun yang tertarik pada zsh secara khusus, saya telah mengajukan pertanyaan tentang U&L SE tentang cara membuat alur kerja yang lebih cepat untuk menyangkal proses latar depan .
Anko
Saya suka solusi ini dan saya akan menerapkannya untuk perintah individual, tetapi saya masih mencari cara untuk mengubah perilaku default Zsh.
Vince
1
@Vince Maksud Anda mengubah default untuk selalu menolak proses latar belakang? Jika demikian, Anda dapat melakukannya dengan setopt nohupfile ~/.zshrc. Kemudian memulai perintah dengan latar belakang &juga akan selalu menolaknya. Meskipun secara default zsh masih akan mengingatkan Anda bahwa Anda memiliki pekerjaan yang sedang berjalan saat Anda mencoba untuk keluar. Anda juga bisa mematikannya dengan setopt nocheckjobs.
Anko
@Anko Saya pikir setopt nocheckjobsmelakukan apa yang saya inginkan. Sekarang saya telah menemukan opsi yang tersedia di man zshoptions. Saya ingin mematikan peringatan. Saya tahu ketika saya memiliki proses latar belakang dan saya tidak membutuhkannya. Saya ingin menutup proses latar belakang kecuali saya memulainya nohup. Saat ini saya menggunakan ini dengan fungsi shell yang menjalankan PyCharm di latar belakang dengan nohup. Saat saya mengetik pycharm .itu berjalan nohup charm $@ &. Tidak menutup saat saya menutup terminal, tetapi saya masih mendapatkan peringatan itu dan harus mengetik exitdua kali.
Vince
59

Dari dokumentasi zsh :

HUP

... Dalam zsh, jika Anda memiliki pekerjaan latar belakang yang sedang berjalan saat shell keluar, shell akan menganggap Anda ingin itu dimatikan; dalam hal ini dikirim sinyal tertentu yang disebut SIGHUP... Jika Anda sering memulai pekerjaan yang seharusnya berjalan bahkan ketika shell telah keluar, maka Anda dapat mengatur opsi NO_HUP, dan pekerjaan latar belakang akan ditinggalkan.

Jadi atur saja NO_HUPopsinya:

% setopt NO_HUP
Carl Norum
sumber
Jika Anda tidak menginginkan peringatan itu, ya.
Carl Norum
30

Saya telah menemukan bahwa menggunakan kombinasi nohup, &dan disownbekerja untuk saya, karena saya tidak ingin secara permanen menyebabkan pekerjaan untuk menjalankan ketika shell telah keluar.

nohup <command> & disown

Sementara hanya &telah bekerja untuk saya di bash, saya menemukan ketika hanya menggunakan nohup, &atau disownuntuk menjalankan perintah, seperti script yang memanggil perintah java run, proses akan tetap berhenti ketika shell keluar.

  • nohupmembuat perintah mengabaikan NOHUPdan SIGHUPmemberi sinyal dari shell
  • & membuat proses berjalan di latar belakang secara subterminal
  • disowndiikuti dengan argumen (indeks nomor pekerjaan dalam daftar pekerjaan Anda) mencegah shell mengirimkan SIGHUPsinyal ke proses turunan. Menggunakan disowntanpa argumen menyebabkannya default ke pekerjaan terbaru.

Saya menemukan informasi nohupdan disowndi halaman ini , dan &informasi dalam jawaban SO ini .

ryanjdillon.dll
sumber
5

Saya biasanya menggunakan screenuntuk menjalankan pekerjaan latar belakang.

1) Buat sesi layar:

screen -S myScreenName

2) Luncurkan skrip, layanan, daemon, atau apa pun

3) Keluar (lepaskan) sesi layar dengan

screen -d

atau jalan pintas ALT+A then d


Setelah beberapa ratus tahun - jika Anda ingin melanjutkan sesi Anda (lampirkan kembali):

screen -r myScreenName

Jika Anda ingin tahu apakah ada sesi layar, nama dan statusnya (terlampir atau terpisah):

screen -ls

Solusi ini bekerja pada semua interpreter terminal seperti bash, zsh dll. Lihat juga man screen

Aydin K.
sumber
Catatan untuk pengguna MacOS, pintasan keyboard untuk melepaskan dari layar adalah Control + A, lalu D. Juga ini adalah satu-satunya pilihan saya ketika saya membiarkan proses berjalan dan menyerah pada stdout, menulis layar -d tidak akan membantu.
Bishoy
Bagus tapi tidak ada hubungannya dengan Q yang secara khusus tentang bagaimana menjaga tugas bg berjalan saat keluar dari ZSH.
RichieHH