Sehen Sie hier
Es gibt zwei Signale, die die Ausführung eines Prozesses unterbrechen können. Man ist "anmutig" und man ist "kraftvoll".
Die "anmutige" ist SIGTSTP
, und ihr Zweck ist es, den Prozess "nett" zu bitten, die Ausführung auszusetzen, wenn es sich danach anfühlt, bis er ein A erhält SIGCONT
. In diesem Fall SIGTSTP
kann der Prozess SIGTSTP ignorieren und trotzdem weiter ausgeführt werden. Dies erfordert daher die Zusammenarbeit mit einem Programm, das für die Verarbeitung von SIGTSTP ausgelegt ist.
Die "erzwungene" ist SIGSTOP
, und ihr Zweck ist es, alle User-Space-Threads, die mit diesem Prozess verbunden sind, anzuhalten. Es ist für den Prozess genauso unmöglich, zu ignorieren SIGSTOP
wie für ihn zu ignorieren SIGKILL
(letzterer beendet den Prozess mit Gewalt).
Um ein beliebiges Signal, einschließlich aller der hier genannten zu senden, können Sie Programme wie kill
, killall
oder pkill
; oder verwenden Sie den Systemaufruf kill(2)
. In den Manpages Ihres Betriebssystems finden Sie plattform- / architektur- / versionsabhängige Details und Errata zu den oben genannten Themen. Beachten Sie, dass das Wort "kill" in all diesen Befehlen und dem syscall eine falsche Bezeichnung ist. Diese Befehle dienen nicht ausschließlich zum Beenden von Prozessen. Sie können das tun, indem sie bestimmte der Signale senden; Signale können jedoch auch für andere Funktionen als zum Beenden eines Prozesses verwendet werden. SIGSTOP
Hält zum Beispiel nur den Prozess an und es ist nur eines von mehreren Signalen, die auf diese Weise gesendet werden können.
Um eine Bedingung für die automatische Wiederaufnahme des Prozesses nach Ablauf einer bestimmten Zeitspanne hinzuzufügen, müssen Sie einen Überwachungsprozess verwenden, der noch ausgeführt wird und einen Timer festlegt, um den Überwachungsprozess zu aktivieren, der dann kill(2)
erneut und erneut aufruft Sendet das SIGCONT
Signal an den gestoppten Prozess, um den Kernel aufzufordern, die Ausführung fortzusetzen. Beachten Sie, dass Linux über mehrere Zeitsteuerungsmechanismen mit unterschiedlichen Genauigkeits- und Präzisionsgraden verfügt. Wenn Ihr System sehr ausgelastet ist, wird Ihr Überwachungsprozess möglicherweise erst aktiviert, wenn der Timer abgelaufen ist. Dies kann zu einer Verzögerung des Aufwachvorgangs führen.
Wenn Sie von einer sehr genauen Genauigkeit der Unterbrechung und der Wiederaufnahme des unterbrochenen Prozesses abhängen, müssen Sie möglicherweise Ihr Überwachungsprogramm mit Echtzeitberechtigungen ausführen ( Informationen dazu, wie Sie Ihren Prozess in Echtzeit ausführen, finden Sie in dieser Manpage auf sched_setscheduler(2)
). Sie können auch hochauflösende Zeitgeber verwenden, eine Funktion des Linux-Kernels (die nur verfügbar ist, wenn Ihre Hardware sie unterstützt), und Echtzeit-Zeitplanung verwenden, um eine sehr genaue Zeitgabe mit einer Genauigkeit von weniger als einer Millisekunde zu erzielen Wecken und senden Sie das Signal, um den überwachten Prozess sehr schnell wieder aufzunehmen.
Sie haben nicht angegeben, mit welchen Technologien Sie dies implementieren möchten. Zumindest benötigen Sie mindestens Bash-Skripte, obwohl Sie auf diese Weise kein genaues Timing erhalten. Hier ist ein Bash "Skript" (ungetestet, also seien Sie vorsichtig), das nur ein Konzeptnachweis für Ihre Anfrage ist. Wenn Sie ein genaues Timing benötigen, müssen Sie ein Programm schreiben, wahrscheinlich in C / C ++ oder einer anderen Muttersprache, und Echtzeit-Zeitplanung und -Hrtimer verwenden.
#!/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}"
Beachten Sie, dass das Skript beendet und das steuernde Skript beendet wird. Aufgrund der screen
Steuerung des Überwachungsprozesses wird es jedoch 10 Sekunden lang im Hintergrund ausgeführt (basierend auf dem Argument, das an übergeben wurde sleep
). Anschließend wird der untergeordnete Prozess aktiviert und fortgesetzt. Dies wird jedoch noch lange dauern, bis das Kontrollskript beendet ist. Wenn Sie synchron warten möchten, bis die Zeit abgelaufen ist, lassen Sie einfach den zweiten Aufruf aus, screen
und codieren Sie den Ruhezustand und den Kill fest in das Kontrollskript.
Sie können testen, ob der Prozess tatsächlich angehalten wird, indem Sie ausführen
screen -rS child
Nachdem Sie dieses Skript gestartet haben. Auf der Konsole wird nichts angezeigt. Nachdem der Timer abgelaufen ist (10 Sekunden), wird Ihr Bildschirm mit Base64-Daten (zufällige Zeichen von 0-9 und AF) überflutet. Drücken Sie zum Beenden Strg + C.