Buraya bak
Vardır , iki , bir işlemin yürütülmesi askıya olabilir sinyaller. Biri "zarif" ve biri "kuvvetli".
“Zarif” olanı SIGTSTP
ve amacı, süreci “hoş bir şekilde” istemesi, eğer böyle hissederse, ihaleyi a olana kadar askıya almaktır SIGCONT
. Bu durumda SIGTSTP
, süreç SIGTSTP'yi görmezden gelebilir ve yine de yürütülmeye devam edebilir, bu nedenle SIGTSTP'yi idare etmek için tasarlanmış bir programdan işbirliğini gerektirir.
"Zorlu" olanıdır SIGSTOP
ve amacı, bu işlemle ilişkili tüm kullanıcı alanı iş parçacıklarını askıya almaktır. Sürecin görmezden geldiği SIGSTOP
gibi görmezden gelmesi de imkansızdır SIGKILL
(ikincisi süreci zorla öldürür).
Aşağıdaki gibi programları kullanabilirsiniz Burada sözü olanlar herhangi dahil keyfi bir sinyal göndermek için kill
, killall
ya da pkill
; veya sistem çağrısını kullanın kill(2)
. Yukarıdakilerden herhangi biriyle ilgili olarak platform / mimari / versiyona bağlı ayrıntılar ve işletim sistemi için işletim sisteminizin man sayfalarına bakın. Tüm bu komutlarda ve sistemde "öldür" kelimesinin kötü bir yanlış isim olduğuna dikkat edin. Bu komutlar şunlardır değil tasarlanmış, münhasıran işlemleri sonlandırmak için. Bunu sinyallerden bazılarını göndererek yapabilirler ; ancak sinyaller, bir işlemi sonlandırmaktan başka işlevsellik için de kullanılabilir. Örneğin, SIGSTOP
yalnızca süreci askıya alır ve bu şekilde gönderilebilecek birkaç sinyalden yalnızca biridir.
Otomatik bir süre geçtikten sonra sürecinin devamının bir koşulu eklemek için, çalışan kalır ve daha sonra sırayla çağırır izleme sürecini, uyanmak için bir zamanlayıcı ayarlar izleme sürecinin çeşit kullanmanız gerekecektir kill(2)
tekrar SIGCONT
çekirdeğin yürütmeyi sürdürmesini istemek için sinyali durdurulan işleme gönderir . Linux'un çeşitli doğruluk ve hassasiyet derecelerinde çeşitli zamanlama mekanizmalarına sahip olduğunu unutmayın; ayrıca, eğer sisteminiz çok yoğunsa, izleme işleminiz zamanlayıcısının süresi doluncaya kadar uyanamayabilir ve bu nedenle uyanma gecikebilir.
Askıya sürecin askıya alınması ve geri çok hassas hassas yapılması gerekir ise, gerçek zamanlı izinleri ile izleme programını çalıştırın (bkz gerekebilir bu manpage üzerinde sched_setscheduler(2)
Prosesinizi gerçek zamanlı yapma konusunda bilgi almak için). Ayrıca, zamanlamada çok hassas, milisaniyenin altında bir hassasiyet elde etmek için Linux çekirdeğinin bir özelliği olan (yalnızca donanımınız onlara destek sağlarsa kullanılabilir) Yüksek Çözünürlüklü Zamanlayıcıları da kullanabilirsiniz. uyandırın ve izlenen süreci çok hızlı bir şekilde devam ettirmek için sinyal gönderin.
Bunu uygulamak için hangi teknolojileri kullanmak istediğinizi belirtmediniz. Çıplak bir şekilde, en azından çok iyi ayarlanmış zamanlamayı bu şekilde elde edemeseniz de en azından bash komut dosyası gerekir. İşte bir bash "script" (denenmemiş, lütfen dikkatli olun) bu sadece sorgunuzun konseptinin bir kanıtıdır. Kesin zamanlamaya ihtiyacınız varsa, muhtemelen C / C ++ veya başka bir ana dilde bir program yazmanız ve gerçek zamanlı zamanlama ve hrtimerler kullanmanız gerekir.
#!/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}"
Komutun sona ereceğini ve kontrol komut dosyasının sonlanacağını unutmayın; ancak screen
izleme işleminin kontrol edilmesi nedeniyle , arka planda 10 saniye (devam eden argümana göre sleep
) çalışmaya devam eder ve sonra uyanıp alt işleme devam eder. Ancak bu kontrol senaryosunun sona ermesinden çok sonra olacaktır. Eşzamanlı olarak zamanın geçmesini beklemek istiyorsan, ikinci aramayı atla ve uyumu screen
zorla kodla ve kontrol komut dosyasına öldür.
Sürecin çalışarak askıya alındığını test edebilirsiniz.
screen -rS child
Bu betiği başlattıktan sonra. Konsolda hiçbir şey göremezsin. Sonra zamanlayıcı süresi dolduktan sonra (10 saniye), ekranınızı base64 verisiyle doldurur (0-9 ve AF'den rastgele karakterler). Çıkmak için Ctrl + C tuşlarına basın.