Süreci hangi ortamdan oluşturuyorsunuz?
Bunu C kodu gibi bir ortamdan yapıyorsanız, çatalla () ve sonra çocukta, exec () işleminden önce kendinize bir SIGSTOP göndererek daha fazla yürütmeyi engelleyebilirsiniz.
Daha genel bir çözüm (muhtemelen en iyisi) bunu yapan bir saplama oluşturmak olacaktır. Yani saplama programı:
- Gerçek programın adı ve argümanlarından oluşan argümanları alın
- kendine bir SIGSTOP gönder
- exec () gerçek programı uygun argümanlarla
Bu, yeni işlemin ona bir sinyal göndermeden önce çok fazla ilerlemesiyle ilgili her türlü yarış koşulundan kaçınmanızı sağlayacaktır.
Kabuk için bir örnek:
#!/bin/bash
kill -STOP $$
exec "$@"
Ve yukarıdaki codez kullanarak:
michael@challenger:~$ ./stopcall.sh ls -al stopcall.sh
[1]+ Stopped ./stopcall.sh ls -al stopcall.sh
michael@challenger:~$ jobs -l
[1]+ 23143 Stopped (signal) ./stopcall.sh ls -al stopcall.sh
michael@challenger:~$ kill -CONT 23143; sleep 1
-rwxr-xr-x 1 michael users 36 2011-07-24 22:48 stopcall.sh
[1]+ Done ./stopcall.sh ls -al stopcall.sh
michael@challenger:~$
jobs -l
PID gösterir. Ancak bir kabuktan yapıyorsanız, doğrudan PID'ye ihtiyacınız yoktur. Sadece şunları yapabilirsiniz: kill -CONT %1
(sadece bir işiniz olduğunu varsayarsak).
Birden fazla iş ile mi yapıyorsunuz? Okuyucu için bir egzersiz olarak bırakıldı :)
#!/bin/bash
[enter]$@ &
[enter]PID=$!
[enter]kill -STOP $PID
[enter]echo "Suspended: $PID, press ENTER to continue it"
[enter]read
[enter]kill -CONT $PID
[enter]wait $PID
[enter]echo