Lihat di sini
Ada dua sinyal yang dapat menunda eksekusi suatu proses. Satu "anggun", dan satu "kuat".
Yang "anggun" adalah SIGTSTP
, dan tujuannya adalah untuk "dengan baik" meminta proses, jika terasa seperti itu, untuk silakan menunda eksekusi sampai menerima a SIGCONT
. Dalam hal ini SIGTSTP
, proses dapat mengabaikan SIGTSTP dan melanjutkan eksekusi, jadi ini membutuhkan kerja sama dari program yang dirancang untuk menangani SIGTSTP.
Yang "kuat" adalah SIGSTOP
, dan tujuannya adalah untuk menangguhkan semua utas pengguna yang terkait dengan proses itu. Sama tidak mungkin bagi proses untuk diabaikan SIGSTOP
sebagaimana halnya untuk diabaikan SIGKILL
(yang terakhir membunuh proses dengan paksa).
Untuk mengirim sinyal sewenang-wenang, termasuk salah satu yang disebutkan di sini, Anda dapat menggunakan program seperti kill
, killall
, atau pkill
; atau gunakan panggilan sistem kill(2)
. Lihat halaman manual sistem operasi Anda untuk detail platform / arsitektur / versi-dependen dan errata mengenai salah satu di atas. Perhatikan bahwa kata "bunuh" dalam semua perintah ini dan syscall adalah istilah yang salah. Perintah-perintah ini tidak dirancang, secara eksklusif, untuk menghentikan proses. Mereka dapat melakukannya dengan mengirimkan sinyal tertentu; tetapi sinyal juga dapat digunakan untuk fungsi selain menghentikan proses. Misalnya, SIGSTOP
hanya menunda proses, dan itu hanya salah satu dari beberapa sinyal yang dapat dikirim dengan cara ini.
Untuk menambahkan kondisi melanjutkan kembali proses secara otomatis setelah periode waktu berlalu, Anda harus menggunakan semacam proses pemantauan yang tetap berjalan dan mengatur timer untuk membangunkan proses pemantauan, yang kemudian akan memanggil kill(2)
lagi dan mengirimkan SIGCONT
sinyal ke proses yang dihentikan, untuk meminta kernel melanjutkan eksekusi. Perhatikan bahwa Linux memiliki beberapa mekanisme pengaturan waktu dengan berbagai tingkat akurasi dan presisi; lebih jauh lagi, jika sistem Anda sangat sibuk, proses pemantauan Anda mungkin tidak akan bangun sampai setelah waktu habis, dan dengan demikian bangun mungkin tertunda.
Jika Anda tergantung pada presisi sangat akurat dari suspensi dan dimulainya kembali proses ditangguhkan, Anda mungkin perlu untuk menjalankan program pemantauan Anda dengan izin real-time (lihat halaman manual ini pada sched_setscheduler(2)
informasi tentang membuat proses Anda real-time). Anda juga dapat menggunakan Timer Resolusi Tinggi, sebuah fitur dari kernel Linux (yang hanya tersedia jika perangkat keras Anda menyediakan dukungan untuk mereka), dalam kombinasi dengan penjadwalan real-time, untuk mendapatkan ketepatan waktu sub-milidetik yang sangat akurat, mengenai pengaturan waktu, kemudian bangun dan kirim sinyal untuk melanjutkan proses yang dipantau dengan sangat cepat.
Anda tidak menunjukkan teknologi mana yang ingin Anda gunakan untuk mengimplementasikan ini. Minimal, Anda memerlukan setidaknya bash scripting, meskipun Anda tidak akan bisa mendapatkan waktu yang sangat halus seperti itu. Berikut ini adalah "skrip" bash (belum diuji, jadi harap berhati-hati) yang hanya merupakan bukti konsep permintaan Anda. Jika Anda membutuhkan pengaturan waktu yang tepat, Anda harus menulis sebuah program, mungkin dalam C / C ++ atau bahasa asli lainnya, dan menggunakan penjadwalan waktu nyata dan hrtimer.
#!/bin/bash
#This is the process you want to suspend.
screen -mdS child bash -c "cat /dev/urandom | base64"
#This is the process ID of the child process
THEPID=$(screen -list | grep child | cut -f1 -d'.' | sed 's/\W//g')
#Send SIGSTOP to the child process.
kill -SIGSTOP ${THEPID}
#Now it is suspended. This process will sleep for 10 seconds asynchronously, then resume the process.
screen -mdS monitor bash -c "sleep 10; kill -SIGCONT ${THEPID}"
Perhatikan bahwa skrip akan berakhir dan skrip pengendali akan berakhir, tetapi karena screen
mengendalikan proses monitor, skrip akan terus berjalan di latar belakang selama 10 detik (berdasarkan argumen yang diteruskan ke sleep
) dan kemudian bangun dan melanjutkan proses anak. Tapi ini akan lama setelah skrip pengendali berakhir. Jika Anda ingin secara sinkron menunggu waktu berlalu, cukup abaikan panggilan kedua ke screen
dan kode-keras sleep dan bunuh ke skrip pengendali.
Anda dapat menguji bahwa proses itu sebenarnya ditangguhkan dengan menjalankan
screen -rS child
setelah Anda memulai skrip ini. Anda tidak akan melihat apa pun di konsol. Kemudian setelah timer berakhir (10 detik), itu akan membanjiri layar Anda dengan data base64 (karakter acak 0-9 dan AF). Tekan Ctrl + C untuk keluar.