Từ môi trường nào bạn đang tạo ra quá trình?
Nếu bạn đang thực hiện nó từ một môi trường như mã C, bạn có thể rẽ nhánh () và sau đó ở trẻ, gửi SIGSTOP cho chính bạn trước lệnh exec (), ngăn chặn việc thực thi thêm.
Một giải pháp chung chung hơn (có lẽ là tốt nhất) sẽ là tạo ra một sơ khai làm như vậy. Vì vậy, chương trình còn sơ khai sẽ:
- Lấy các đối số bao gồm tên và đối số của chương trình thực
- gửi một SIGSTOP cho chính nó
- exec () chương trình thực với các đối số thích hợp
Điều này sẽ đảm bảo rằng bạn tránh mọi loại điều kiện cuộc đua phải làm với quá trình xử lý mới đi quá xa trước khi bạn có thể gửi tín hiệu đến nó.
Một ví dụ cho shell:
#!/bin/bash
kill -STOP $$
exec "$@"
Và sử dụng codez ở trên:
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:~$
Các jobs -l
chỉ ra PID. Nhưng nếu bạn đang thực hiện nó từ một vỏ, bạn không cần trực tiếp PID. Bạn chỉ có thể làm: kill -CONT %1
(giả sử bạn chỉ có một công việc).
Làm điều đó với nhiều hơn một công việc? Còn lại như một bài tập cho người đọc :)
#!/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