З якого середовища ви створюєте процес?
Якщо ви робите це з середовища, такого як код C, ви можете роздрібнити (), а потім у дитині, надіслати SIGSTOP до себе перед exec (), запобігаючи подальшому виконанню.
Більш загальним рішенням (мабуть, найкращим) було б створити заглушку, яка це робить. Тож програма заглушки:
- Візьміть аргументи, що складаються з реального імені програми та аргументів
- надішліть собі SIGSTOP
- exec () реальна програма з відповідними аргументами
Це дозволить уникнути будь-яких умов перегонів, пов’язаних із тим, що нова обробка стає занадто далеко, перш ніж ви зможете надіслати на неї сигнал.
Приклад оболонки:
#!/bin/bash
kill -STOP $$
exec "$@"
І за допомогою наведеного вище кодексу:
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. Але якщо ви робите це з оболонки, вам не потрібен PID безпосередньо. Можна просто зробити: kill -CONT %1
(якщо у вас є лише одна робота).
Робите це з більш ніж однією роботою? Зліва як вправа для читача :)
#!/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] [enter]echo