Normalde buraya göndermeyin ama saçımı bu saçın üzerinden söküyorum. Ben başlatıldığında çatal ve diğer işlemler bir grup başlatmak için sorumlu bir Python komut dosyası var. Bu komut dosyası başlangıçta sysvinit aracılığıyla başlatıldı, ancak son zamanlarda Debian Jessie'ye geçtim, bu yüzden bunu systemd üzerinden başlatmak için uyarladım.
Ne yazık ki, çalışamayacağım bir sorunla karşılaşıyorum. Komut dosyasını doğrudan bir kullanıcı kabuğunda başlattığınızda, alt süreçlerini doğru bir şekilde başlatır ve komut dosyası çıkışlarında alt süreçler yetim kalır ve çalışmaya devam eder.
Systemd ile başlatıldığında, ana süreç çıkarsa, çocukların hepsi de çıkar (Evet, Ekranın başlattığı ve Ölü olarak göründüğü ???)
İdeal olarak ben tüm alt süreçleri öldürmeden ana komut dosyası yeniden başlatmak gerekir, eksik bir şey var mı?
Teşekkürler!
[Unit]
Description=Server commander
After=network.target
[Service]
User=serveruser
Type=forking
PIDFile=/var/Server/Server.pid
ExecStart=/var/Server/Server.py
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
Düzenleme: Muhtemelen benim için Python betiği temelde onun alt süreçleri için bir 'denetleyici' olduğunu işaret etmek önemlidir. Merkezi bir sunucudan istendiği gibi gnu ekranlarındaki sunucuları başlatır ve durdurur. Normalde her zaman çalışır, hizmet üretmez ve çıkmaz. Ancak süreçleri pid 1'e yetim kalsa bile, alt süreçleri öldürmeden komut dosyasını yeniden yükleyebileceğim durumlar var. Aslında, Python komut dosyasının işlemleri şu şekilde başlatması bile fark etmez hatta bir ebeveyn süreci.
Nasıl çalıştığına dair daha iyi bir açıklama:
- Systemd ortaya çıkar / Server.py
- Server.py, Systemd için pid dosyasını çatallar ve yazar
- Server.py daha sonra talimatlarını temel alarak gnu ekranında sunucu işlemlerini başlatır
- Server.py, sunucudan istenen tüm yeniden başlatmaları gerçekleştirmek için çalışmaya devam eder
Systemd olmadan başlatılırken, Server.py yeniden başlatılabilir ve başlattığı gnu ekranları etkilenmez. Systemd ile başlatılırken, Server.py kapatıldığında, bu ekran işlemleri pid 1'e yetim olmak yerine öldürülür.
simple
ya forking
aslında), son çare olacağını Type=oneshot
, RemainAfterExit=yes
ve KillMode=control-group
.
Server.py
Başlatılan hizmetler çatalı (çatalsa) nasıl kodu ve açıklaması olmadan bir çözüm sağlamak zordur . Ancak, genel olarak konuşursak, bu bir hazır olma protokolü uyumsuzluk problemidir.