Düzenli programlardan birkaçı (düzenli olarak) "Kullanıcı tanımlı sinyal 1" mesajıyla kilitleniyor. Bir nohup
komut olduğunu biliyorum , ama bir nousr1
komut var mı? Yoksa nohup
USR1 ile benzer bir şey yapacak mı?
Düzenli programlardan birkaçı (düzenli olarak) "Kullanıcı tanımlı sinyal 1" mesajıyla kilitleniyor. Bir nohup
komut olduğunu biliyorum , ama bir nousr1
komut var mı? Yoksa nohup
USR1 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 nohup
ikili dosyayı şu şekilde yükleyin /usr/bin/nousr1
:
cp /path/to/coreutils/src/nohup /usr/bin/nousr1
Kontrol ettim bu sonra, sleep 1000
ilgili çıkışları USR1
iken nousr1 sleep 1000
bu sinyale karşı bağışık değildir.
nohup
arada, ana işlevi , işlemi terminalden ayırmaktır, böylece SIGHUP
ilk 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.c
işlem SIGHUP
. Ne nohup
sinyali 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, SIGHUP
terminal kapatıldığında işlem gönderilecektir . Diğer tarafta orada benzer şeyi yapar bash, var disown
komutu, ama emin nasıl değilim o uygulanmaktadır - belki Şunu bir şekilde.
Kabuk trap
yerleşik komutuna ne dersiniz ?
trap 'echo "Thou shalt not USR1 me"' USR1
trap
Komutun 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 myprogram
SIGUSR1 almak ama kabuk sonra çalıştırır echo
gelen trap
komuta.
trap '' SIGUSR1; gvimdiff file1 file2
ve Vim birlikte öldü "Vim: USR1 sinyali ölümcül yakalandı".