Ver aquí
Hay dos señales que pueden suspender la ejecución de un proceso. Uno es "agraciado" y el otro es "contundente".
El "elegante" es SIGTSTP
, y su propósito es "amablemente" pedirle al proceso, si lo desea, suspender la ejecución hasta que reciba un SIGCONT
. En el caso de SIGTSTP
, el proceso puede ignorar SIGTSTP y continuar ejecutándose de todos modos, por lo que esto requiere la cooperación de un programa diseñado para manejar SIGTSTP.
El "contundente" es SIGSTOP
, y su propósito es suspender todos los hilos del espacio de usuario asociados con ese proceso. Es tan imposible ignorar el proceso SIGSTOP
como ignorarlo SIGKILL
(este último mata el proceso con fuerza).
Para enviar una señal arbitraria, incluyendo cualquiera de los mencionados aquí, se puede utilizar programas como kill
, killall
o pkill
; o use la llamada del sistema kill(2)
. Consulte las páginas de manual de su sistema operativo para obtener detalles de la plataforma / arquitectura / versión dependiente y erratas con respecto a cualquiera de los anteriores. Tenga en cuenta que la palabra "kill" en todos estos comandos y syscall es un nombre inapropiado. Estos comandos no están diseñados, exclusivamente, para terminar procesos. Ellos pueden hacerlo mediante el envío de ciertos de las señales; pero las señales también se pueden usar para una funcionalidad que no sea terminar un proceso. Por ejemplo, SIGSTOP
solo suspende el proceso, y es solo una de varias señales que se pueden enviar de esta manera.
Para agregar una condición de reanudar automáticamente el proceso después de que haya transcurrido un período de tiempo, deberá usar algún tipo de proceso de monitoreo que permanezca en ejecución y establecer un temporizador para activar el proceso de monitoreo, que a su vez llama kill(2)
nuevamente y envía la SIGCONT
señal al proceso detenido, para solicitar que el núcleo reanude la ejecución. Tenga en cuenta que Linux tiene varios mecanismos de temporización con diversos grados de precisión y precisión; Además, si su sistema está muy ocupado, es posible que su proceso de monitoreo no se despierte hasta mucho después de que su temporizador haya expirado, por lo que la activación podría retrasarse.
Si depende de la precisión muy exacta de la suspensión y reanudación del proceso de suspensión, es posible que tenga que ejecutar el programa de monitoreo con permisos en tiempo real (ver esta página de manual de sched_setscheduler(2)
la información acerca de hacer su proceso en tiempo real). También puede usar temporizadores de alta resolución, una característica del kernel de Linux (que solo está disponible si su hardware les brinda soporte), en combinación con la programación en tiempo real, para obtener una precisión muy precisa y submilisegunda en el tiempo, luego despertar y enviar la señal para reanudar el proceso monitoreado muy rápidamente.
No indicó qué tecnologías está dispuesto a utilizar para implementar esto. Como mínimo, necesitará al menos secuencias de comandos bash, aunque no podrá obtener una sincronización muy fina de esa manera. Aquí hay un "script" bash (no probado, así que tenga cuidado) que es solo una prueba de concepto de su consulta. Si necesita una sincronización precisa, tendrá que escribir un programa, probablemente en C / C ++ u otro idioma nativo, y utilizar la programación en tiempo real y hrtimers.
#!/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}"
Tenga en cuenta que la secuencia de comandos finalizará y la secuencia de comandos de control finalizará, pero debido a que screen
controla el proceso del monitor, continuará ejecutándose en segundo plano durante 10 segundos (según el argumento pasado sleep
) y luego se activará y continuará el proceso secundario. Pero esto pasará mucho tiempo después de que el script de control haya finalizado. Si desea esperar sincrónicamente el tiempo transcurrido, simplemente omita la segunda llamada screen
y codifique el modo de suspensión y elimínelo en el script de control.
Puede probar que el proceso de hecho se suspende ejecutando
screen -rS child
después de comenzar este script. No verá nada en la consola. Luego, después de que el temporizador caduque (10 segundos), inundará su pantalla con datos de base64 (caracteres aleatorios de 0-9 y AF). Presione Ctrl + C para salir.
Sí, puede hacerlo enviando una señal de PARADA a un proceso para suspenderlo y luego un CONT para continuar.
uso:
fuente
Si tiene una definición adecuada de "congelar", puede consultar el
renice
comando.Renice le permite modificar la prioridad de programación de los procesos en ejecución.
El valor normal del proceso normal es 0. Aumentar el valor agradable hace que el proceso sea más agradable, como en "por qué no vas primero". Si bien disminuir el valor agradable hace que un proceso sea menos agradable, como en "sal de mi camino, tengo prisa". El rango de valores agradable es de -20 a 19.
Cualquiera puede hacer que sus propios procesos sean más agradables. Solo root puede hacer que un proceso sea menos agradable o cambiar la simplicidad de los procesos de otros usuarios.
Si establece un valor agradable de procesos en 19, solo se ejecutará cuando nada más en el sistema lo desee.
Aquí hay un ejemplo que se ejecuta en mi caja de Linux local.
Use
ps -l
y mire la columna NI para ver un buen valor de procesos.La ejecución
renice +10
en el proceso vim hace que se ejecute con una prioridad más baja.Suponiendo que puede estirar "congelar" para que signifique "no molestar a nadie más en el sistema", podría escribir algo así como:
(recuerde ejecutarlo como root).
tenga en cuenta que me tomé algunas libertades con el
ps -l
resultado anterior para que las columnas interesantes se muestren bien en los pequeños cuadros azules :)fuente