Zsh'den çıkın, ancak çalışan işleri açık bırakın.


96

Sadece bash'den zsh'a geçtim.

Bash'de, kabuk çıktığı zaman arka plan görevleri çalışmaya devam eder. Örneğin burada, aşağıdakilerden dolphinsonra koşmaya devam eder exit:

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

Varsayılan davranış olarak istediğim şey bu.

Aksine, zsh'nin davranışı, işleri çalıştırma konusunda uyarmak exitve sonra exittekrar kapatırsanız kapatmaktır . Örneğin burada, dolphinikinci exitkomut aslında kabuktan çıktığında kapanır:

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

Burada zsh'nin bash'lar gibi varsayılan davranışını nasıl yaparım?

Yanıtlar:


169

Programı şu şekilde başlatın &!:

dolphin &!

&!( Ya da eşit şekilde,&| ), her ikisi de bir zsh özgü kısayol arka ve çıkmamak kabuktan çıkan çalışmasını bırakacak şekilde işlem.


2
Tamlık için, başladıktan sonra nasıl reddedileceğini de listeleyebilir misiniz?
trusktr


Bu çözümü beğendim ve bireysel komutlar için uygulayacağım, ancak yine de Zsh'ın varsayılan davranışını değiştirmenin bir yolunu arıyorum.
Vince

1
@Vince Varsayılanı arka planda çalışan işlemleri her zaman reddetmek için değiştirmeyi mi kastediyorsunuz? Eğer öyleyse, ile yapabilirsiniz setopt nohupGözlerinde farklı ~/.zshrc. Ardından arka planda bir komut başlatmak &da onu her zaman reddeder. Yine de varsayılan olarak zsh, çıkmaya çalıştığınızda çalışan işlerinizin olduğunu size hatırlatacaktır. Bunu da ile kapatabilirsiniz setopt nocheckjobs.
Anko

@Anko Sanırım setopt nocheckjobsne istersem onu yapar. Şimdi mevcut seçenekleri buldum man zshoptions. Uyarıyı kapatmak istiyorum. Arka plan süreçlerim olduğunda biliyorum ve buna ihtiyacım yok. Başlamadıkça arka plan işlemlerini kapatmasını istiyorum nohup. Şu anda bunu PyCharm'ı arka planda çalıştıran bir kabuk işlevi ile kullanıyorum nohup. Yazdığımda pycharm .çalışır nohup charm $@ &. Terminali kapattığımda kapanmıyor, ancak yine de bu uyarıyı alıyorum ve exitiki kez yazmam gerekiyor.
Vince

59

Gönderen zsh belgeler :

HUP

... zsh'da, kabuk çıktığında çalışan bir arka plan işiniz varsa, kabuk bunun öldürülmesini istediğinizi varsayacaktır; bu durumda, SIGHUP... adı verilen belirli bir sinyal gönderilir. Kabuktan çıkıldığında bile devam etmesi gereken işleri sık sık başlatırsanız, seçeneği ayarlayabilirsiniz NO_HUPve arka plan işleri yalnız kalacaktır.

O yüzden sadece NO_HUPseçeneği ayarlayın :

% setopt NO_HUP

Uyarıyı istemiyorsan, evet.
Carl Norum

30

Ben bulduk bir arada kullanarak bu nohup, &ve disownben kabuk çıkıldığı zaman kalıcı işler çalıştırmak için neden istemiyorum, benim için işler.

nohup <command> & disown

Sadece iken &benim için çalışmıştır bashyalnızca kullanırken buldum nohup, &ya disownkabuk çıkıldığında bir java run komutu çağıran bir komut dosyası gibi komutları çalıştırma hakkında, süreç hala durdurmak olacaktır.

  • nohupkomutun yok sayılmasını sağlar NOHUPve SIGHUPkabuktan sinyal verir
  • & sürecin arka planda bir alt terminalde çalışmasını sağlar
  • disownardından bir bağımsız değişken (işler listenizdeki iş numarasının dizini), kabuğun SIGHUPalt süreçlere sinyal göndermesini engeller . disownBağımsız değişken olmadan kullanmak , varsayılan olarak en son işi kullanmasına neden olur.

Bulduğum nohupve disownbilgiler bu sayfada ve &bilgiler bu SO cevap .


5

Genellikle screenarka plan işlerini çalışır durumda tutmak için kullanırım .

1) Bir ekran oturumu oluşturun:

screen -S myScreenName

2) Komut dosyalarınızı, hizmetlerinizi, arka plan yordamlarınızı veya her neyse başlatın

3) Ekran oturumundan çıkın (ayırın)

screen -d

veya kısayol ALT+A then d


Birkaç yüz yıl sonra - oturumunuzu devam ettirmek istiyorsanız (yeniden bağlayın):

screen -r myScreenName

Bir ekran oturumu olup olmadığını, adını ve durumunu (ekli veya ayrılmış) bilmek istiyorsanız:

screen -ls

Bu çözüm, bash, zsh vb. Gibi tüm terminal yorumlayıcılarında çalışır. Ayrıca bkz. man screen


MacOS kullanıcıları için bir not, ekrandan ayırmak için klavye kısayolu Control + A, sonra D idi. Ayrıca bu, bir işlemi çalışır durumda bırakıp stdout'a bıraktığımda tek seçeneğimdi, ekran -d yazmak yardımcı olmazdı.
Bishoy

Güzel ama özellikle ZSH'den çıkarken bg görevlerinin nasıl çalıştırılacağıyla ilgili olan Q ile ilgisi yok.
RichieHH
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.