Prácticamente, necesito un proceso que se comporte, como si hubiera presionado Ctrl+Zjusto 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 -lmuestra 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
execllamada 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.killcomando envía la señal STOP a este proceso, que lo pone en estado suspendido.CONTseñal), elexeccomando hace que se reemplace con el programa deseado.my_commandmantiene el PID original de la sub-shell.$!variable para obtener el PID del proceso.fuente
-s STOPlugar de-SIGSTOP). Todavía me pregunto: ¿por qué tiene que ser en$BASHPIDlugar 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 $PIDparte: 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.$BASHPIDde proyectiles que no sean bash, consulte aquí