Vedi qui
Esistono due segnali che possono sospendere l'esecuzione di un processo. Uno è "aggraziato" e l'altro è "forte".
Quello "grazioso" è SIGTSTP
, e il suo scopo è quello di "piacevolmente" chiedere al processo, se ne ha voglia, di sospendere l'esecuzione fino a quando non riceve un SIGCONT
. Nel caso di SIGTSTP
, il processo può ignorare SIGTSTP e continuare comunque l'esecuzione, quindi ciò richiede la cooperazione di un programma progettato per gestire SIGTSTP.
Quello "forte" è SIGSTOP
, e il suo scopo è quello di sospendere tutti i thread dello spazio utente associati a quel processo. È altrettanto impossibile che il processo ignori SIGSTOP
come lo è ignorarlo SIGKILL
(quest'ultimo uccide il processo con forza).
Per inviare un segnale arbitrario, compresa qualsiasi di quelli menzionati qui, è possibile utilizzare programmi come kill
, killall
o pkill
; o usa la chiamata di sistema kill(2)
. Vedi le manpage del tuo sistema operativo per dettagli sulla piattaforma / architettura / dipendenti dalla versione ed errori relativi a quanto sopra. Si noti che la parola "kill" in tutti questi comandi e syscall è un termine improprio. Questi comandi non sono progettati, esclusivamente, per terminare i processi. Essi possono farlo inviando certuni dei segnali; ma i segnali possono anche essere usati per funzionalità diverse dalla conclusione di un processo. Ad esempio, SIGSTOP
sospende solo il processo ed è solo uno dei numerosi segnali che possono essere inviati in questo modo.
Per aggiungere una condizione per riprendere automaticamente il processo dopo che è trascorso un periodo di tempo, sarà necessario utilizzare una sorta di processo di monitoraggio che rimane in esecuzione e imposta un timer per riattivare il processo di monitoraggio, che a sua volta chiama di kill(2)
nuovo e invia il SIGCONT
segnale al processo arrestato, al fine di richiedere al kernel di riprendere l'esecuzione. Nota che Linux ha diversi meccanismi di temporizzazione con vari gradi di accuratezza e precisione; inoltre, se il tuo sistema è molto occupato, il tuo processo di monitoraggio potrebbe non essere attivato fino a quando il suo timer non è scaduto, e quindi la sveglia potrebbe essere ritardata.
Se si dipende da molto accurata precisione di sospensione e ripresa del processo di sospensione, potrebbe essere necessario eseguire il programma di monitoraggio con le autorizzazioni in tempo reale (si veda questa pagina di manuale su sched_setscheduler(2)
per informazioni su come rendere il vostro processo in tempo reale). Puoi anche usare i timer ad alta risoluzione, una funzione del kernel Linux (che è disponibile solo se il tuo hardware fornisce supporto per loro), in combinazione con la pianificazione in tempo reale, per ottenere una precisione molto precisa, inferiore al millisecondo, sveglia e invia il segnale per riprendere il processo monitorato molto rapidamente.
Non hai indicato quali tecnologie sei disposto a utilizzare per implementarlo. Come minimo, avrai bisogno almeno degli script bash, anche se non sarai in grado di ottenere un tempismo molto preciso in quel modo. Ecco uno "script" bash (non testato, quindi fai attenzione) che è solo una prova del concetto della tua query. Se hai bisogno di un tempismo preciso, dovrai scrivere un programma, probabilmente in C / C ++ o in un'altra lingua nativa, e utilizzare la programmazione in tempo reale e 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}"
Si noti che lo script terminerà e lo script di controllo verrà terminato, ma a causa del screen
controllo del processo di monitoraggio, continuerà a essere eseguito in background per 10 secondi (in base all'argomento passato a sleep
), quindi riattivare e continuare il processo figlio. Ma questo passerà molto tempo dopo la fine dello script di controllo. Se si desidera attendere in modo sincrono il tempo che deve trascorrere, è sufficiente omettere la seconda chiamata screen
e codificare il sonno e uccidere nello script di controllo.
È possibile verificare che il processo si interrompa effettivamente eseguendo
screen -rS child
dopo aver avviato questo script. Non vedrai nulla sulla console. Quindi una volta scaduto il timer (10 secondi), inonderà lo schermo di dati base64 (caratteri casuali da 0-9 e AF). Premi Ctrl + C per uscire.