Hizmetleri unix tabanlı bir sisteme yerleştirirken, sysadmin açısından pratik farklar nelerdir?
Hizmetleri unix tabanlı bir sisteme yerleştirirken, sysadmin açısından pratik farklar nelerdir?
Yanıtlar:
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.
&
parça açıklamasını cevabınıza ekleyin . Eksik gibi görünüyor .. orijinal soruyu kontrol ederseniz.
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
) ...
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.
İ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, HUP
sinyali 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.out
ya2>errors.out
Ayrıca çoğu sistemde nohup
komuta erişiminiz de olabilir .
nohup
bu 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.out
ancak bu dosya adı bir seçenekle değiştirilebilir.
command &
ile disown
daha sonra bir nohup olarak çalışan, daha sonra kabuktan ayrılabileceğini not etmek için.