Düzenli programlardan birkaçı (düzenli olarak) "Kullanıcı tanımlı sinyal 1" mesajıyla kilitleniyor. Bir nohupkomut olduğunu biliyorum , ama bir nousr1komut var mı? Yoksa nohupUSR1 ile benzer bir şey yapacak mı?
Düzenli programlardan birkaçı (düzenli olarak) "Kullanıcı tanımlı sinyal 1" mesajıyla kilitleniyor. Bir nohupkomut olduğunu biliyorum , ama bir nousr1komut var mı? Yoksa nohupUSR1 ile benzer bir şey yapacak mı?
Yanıtlar:
Yardımcı programa benzetmek için basit bir hacky çözümü nohup, ancak SIGUSR1, coreutils kaynağının bir kopyasını almak , paketten çıkarmak ,
sed -i 's/SIGHUP/SIGUSR1/' /path/to/coreutils/src/nohup.c
, isteğe bağlı olarak çıktı dosyasının adını da değiştirin
sed -i 's/nohup\.out/nousr1.out/g' /path/to/coreutils/src/nohup.c
, bu kaynağı derleyin ve yeni derlenen nohupikili dosyayı şu şekilde yükleyin /usr/bin/nousr1:
cp /path/to/coreutils/src/nohup /usr/bin/nousr1
Kontrol ettim bu sonra, sleep 1000ilgili çıkışları USR1iken nousr1 sleep 1000bu sinyale karşı bağışık değildir.
nohuparada, ana işlevi , işlemi terminalden ayırmaktır, böylece SIGHUPilk etapta gönderilmez . Ayrıca bir sinyal işleyici kurması ek bir avantajdır, ancak gereksiz olmalıdır.
signal(SIGHUP,SIG_IGN);aramayı kaldırırsanız nohup.cişlem SIGHUP. Ne nohupsinyali görmezden gelen bir kenara tıpkı terminal dışı dosyalar olarak Stdin, stdout stderr tanımlayıcılar yeniden açıyor. Süreci terminalden gerçekten özel bir şekilde ayırmaz. Yani, SIGHUPterminal kapatıldığında işlem gönderilecektir . Diğer tarafta orada benzer şeyi yapar bash, var disownkomutu, ama emin nasıl değilim o uygulanmaktadır - belki Şunu bir şekilde.
Kabuk trapyerleşik komutuna ne dersiniz ?
trap 'echo "Thou shalt not USR1 me"' USR1
trapKomutun formunu boş bir argümanla kullanmanız gerekir . Bunu dene:
trap '' SIGUSR1; myprogram
Bu, yapmaya çalıştığınız SIGUSR1 sinyalini yok sayar. Her ne kadar yorumcularla aynı fikirde olsam da, muhtemelen burada gözle görülenden daha fazlası oluyor.
Yanlış form:
trap 'echo ...' SIGUSR1; myprogram
Hala sağlayacak myprogramSIGUSR1 almak ama kabuk sonra çalıştırır echogelen trapkomuta.
trap '' SIGUSR1; gvimdiff file1 file2ve Vim birlikte öldü "Vim: USR1 sinyali ölümcül yakalandı".