Prácticamente, necesito un proceso que se comporte, como si hubiera presionado Ctrl+Z
justo después de que comenzara.
Con suerte, es posible hacer tal cosa usando un script de shell.
(Además, conocer el PID resultante sería genial, por lo que podría continuar el proceso después).
linux
process
background-process
java.is.for.desktop
fuente
fuente
#!/bin/bash
[enter]$@ &
[enter]PID=$!
[enter]kill -STOP $PID
[enter]echo "Suspended: $PID, press ENTER to continue it"
[enter]read
[enter]kill -CONT $PID
[enter]wait $PID
[enter]echo
¿Desde qué entorno está creando el proceso?
Si lo hace desde un entorno como el código C, puede bifurcar () y luego, en el elemento secundario, enviarse un SIGSTOP a usted mismo antes del exec (), evitando una mayor ejecución.
Una solución más genérica (probablemente la mejor) sería crear un trozo que lo haga. Entonces el programa stub:
Esto asegurará que evite cualquier tipo de condiciones de carrera que tengan que ver con que el nuevo procesamiento llegue demasiado lejos antes de que pueda enviarle una señal.
Un ejemplo para shell:
Y usando el codez anterior:
El
jobs -l
muestra el PID. Pero si lo está haciendo desde un shell, no necesita el PID directamente. Simplemente puede hacer:kill -CONT %1
(suponiendo que solo tenga un trabajo).¿Hacerlo con más de un trabajo? Dejado como ejercicio para el lector :)
fuente
La respuesta de MikeyB es correcta. De esta pregunta sobre superusuario, aquí hay una versión más concisa:
Para comprender esto, uno debe comprender cómo se inician los procesos en Unix: la
exec
llamada del sistema reemplaza el programa que se está ejecutando actualmente por uno nuevo , preservando el PID existente. Entonces, la forma en que se crea un proceso independiente es primerofork
, y luegoexec
, reemplazar el programa en ejecución en el proceso secundario con el programa deseado.Los ingredientes de este comando de shell son:
(...)
comienzan un sub-shell: otra instancia de BASH.kill
comando envía la señal STOP a este proceso, que lo pone en estado suspendido.CONT
señal), elexec
comando hace que se reemplace con el programa deseado.my_command
mantiene el PID original de la sub-shell.$!
variable para obtener el PID del proceso.fuente
-s STOP
lugar de-SIGSTOP
). Todavía me pregunto: ¿por qué tiene que ser en$BASHPID
lugar de$$
? (Puede que realmente no entienda la diferencia).$$
vs$BASHPID
, verifico que este último es el PID del sub-shell, mientras que no es el primero. Hay un problema curioso: al aplicar la sugerencia en un script bash, la mayoría de las veces falla, y tengo que hacer algo como esto:PID=$!; ps -p $PID; kill -s CONT $PID;
... falla si elimino laps -p $PID
parte: el proceso parece desaparecer (¿muerto?) Sin un mensaje de error en ningún lado . Está bien desde un shell interactivo, el problema es solo del script. Eso es demasiado misterioso.$BASHPID
de proyectiles que no sean bash, consulte aquí