Dari lingkungan mana Anda membuat proses?
Jika Anda melakukannya dari lingkungan seperti kode C, Anda dapat melakukan fork () dan kemudian pada child, mengirim SIGSTOP ke diri Anda sendiri sebelum exec (), mencegah eksekusi lebih lanjut.
Solusi yang lebih umum (mungkin yang terbaik) adalah dengan membuat rintisan. Jadi program rintisan akan:
- Ambil argumen yang terdiri dari nama dan argumen program sebenarnya
- mengirim SIGSTOP ke dirinya sendiri
- exec () program nyata dengan argumen yang sesuai
Ini akan memastikan bahwa Anda menghindari segala jenis kondisi balapan yang berkaitan dengan pemrosesan baru terlalu jauh sebelum Anda dapat mengirim sinyal ke sana.
Contoh untuk shell:
#!/bin/bash
kill -STOP $$
exec "$@"
Dan menggunakan kodez di atas:
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:~$
The jobs -l
menunjukkan PID. Tetapi jika Anda melakukannya dari shell Anda tidak perlu PID secara langsung. Anda cukup melakukan: kill -CONT %1
(dengan asumsi Anda hanya memiliki satu pekerjaan).
Melakukannya dengan lebih dari satu pekerjaan? Ditinggalkan sebagai latihan untuk pembaca :)
#!/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