Bir programı arka plan olarak çalıştırmak ve onu '&' ile arka planda tutmak arasındaki fark nedir?


Yanıtlar:


31

Geleneksel bir yardımlaşma yöntemi şudur:

fork()
setsid()
close(0) /* and /dev/null as fd 0, 1 and 2 */
close(1)
close(2)
fork()

Bu, işlemin artık terminal ile aynı işlem grubunda kalmamasını ve bununla birlikte öldürülmemesini sağlar. IO yönlendirmesi, çıkışın terminalde görünmemesini sağlamaktır.


5
öyleyse, arkaplan işlemini (&) ortaya çıkaran bir terminal kapatılırsa arkaplan süreci de sona erer mi?
user1561108, 23:12

9
Terminal çıkınca işlem SIGHUP alır, bu sinyalin varsayılan işleyicisi süreci sonlandırmaktır.
Dennis Kaarsemaker

12
Lütfen &parça açıklamasını cevabınıza ekleyin . Eksik gibi görünüyor .. orijinal soruyu kontrol ederseniz.
mtk

1
Bunun nedeni, arka planda çalışan şeyleri çalıştırmak ve sürecin özel bir şey
yapmasını engellemektir

33

Bir cini için istediğin şey, hiçbir şeye bağlı olmayan bir süreçtir. En azından, kendi oturumunda olmasını, bir terminale bağlanmamasını, ana öğeden herhangi bir şeye açık olan herhangi bir dosya tanımlayıcısına sahip olmamasını, sizi önemseyen bir ana babaya (init dışında) sahip olmamasını istiyorsunuz. dizinde /bir miktar engellememek için ...

Bir terminalden ayrılmak için yeni bir oturum oluşturursunuz, ancak bir oturum oluşturmak için grup (veya oturum) lideri olmamanız gerekir, bu nedenle en iyisi yeni bir işlemi başlatmaktır. Ebeveynin çıkacağı varsayıldığında, bu aynı zamanda sürecin artık bir ebeveyni olmayacağı ve init tarafından benimseneceği anlamına gelir. Daha sonra, olası tüm dosya tanımlayıcılarını kapatın, siz chdir("/")(bir dosya kaynak tanımlayıcıları için olduğu gibi bu kaynağı serbest bırakmak için mevcut çalışma dizinini kapatamazsınız/ , mevcut çalışma dizinlerini en azından dizinlerin kaldırılmasını engellemez).

Bu işlem bir oturum lideri olduğu için, bir terminal cihazı açarsa, o terminalin kontrol süreci haline gelme riski vardır. İkinci kez çatallamak bunun olmamasını sağlar.

Öte yandan, &, etkileşimli mermilerde, yeni bir işlem grubunu çatallar ve yaratır (terminalin ön plan işlem grubunda olmayacak şekilde) ve etkileşimli olmayan mermilerde bir işlem yapar ve içindeki SIGINT'i yok sayar. Terminalden ayrılmaz, dosya tanımlayıcılarını kapatmaz (bazı mermiler yeniden açılacak olsa da /dev/null) ...


chdir ("/") kullanımı nedir? dosya tanımlayıcısını kapatmak için?
Timothy Leung,

@TimothyLeung, düzenlemeye bakın.
Stéphane Chazelas

8

Bir program / işlemin bir arka plan programı olarak çalıştırılmasıyla ve işaret işaretini kullanarak arka plana aktarılması arasındaki fark temel olarak mülkiyetle ilgilidir.

Çoğu zaman, bir servetin ana süreci init işlemidir (bir Unix sisteminde başlatılan ilk işlem), bu sürecin çocuğu olan bu arka plan, ayrıcalıklı olmayan bir kullanıcı olarak doğrudan kontrolünüz altında olmadığı anlamına gelir. . Öte yandan, bir programı / işlemi arka plana yazmak, istediğiniz zaman onu ön plana çağırabilir ve / veya onu öldürebileceğiniz anlamına gelir.


1
Ayrıca, bir işlemi terminalin çocuğu olarak tutmak yerine bir işlemi ayırmanın yukarıdaki teknik yönünü yanıtlamak için, "nohup firefox &" çalıştırmayı deneyebilirsiniz
Odaym

7

İle command &Kişisel süreç SIGHUP sinyali ile öldürülecek ebeveyn öldüğünde.

Yine de, Sysadmins bazı geçici çözümlere erişebilir.

Bir bash sisteminde, şunları kullanabilirsiniz:

(trap '' HUP; command) &

Bu, bir alt kabuk açar, HUPsinyali boş bir işleyici ile yakalar ve bir amper / çatal.

Çıktı yine yanlış yönlendirilmiş olabilir tty. Ya da kaybol.
Sen çözebilir bununla &>command.out, 1>output.outya2>errors.out

Ayrıca çoğu sistemde nohupkomuta erişiminiz de olabilir .
nohupbu süreci büyük ölçüde basitleştirir. Oldukça standart, ancak birçok meşgul kutu gömülü ARM dağıtımını eksik buldum. Sadece yaz

nohup command &

..ve bitirdiniz. Çıktı, IIRC'ye yönlendirilir, nohup.outancak bu dosya adı bir seçenekle değiştirilebilir.


2
Sadece ZSH command &ile disowndaha sonra bir nohup olarak çalışan, daha sonra kabuktan ayrılabileceğini not etmek için.
matematik
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.