Estoy tratando de separar un proceso de un script bash para que SIGINT no se reenvíe al proceso cuando salga del script.
He utilizado el disown
comando en la terminal directamente, sin embargo, en bash, disown
no impide que SIGINT se reenvíe. El propósito de este script es iniciar openocd y luego gdb con una sola invocación. Dado que el script nunca sale (está ejecutando gdb) SIGINT todavía se reenvía desde gdb a openocd, lo cual es un problema ya que SIGINT se usa como comando de detención en gdb.
En la terminal se vería así:
$ openocd & # run openocd demonized
$ disown $! # disown last pid
$ gdb # invoke GDB
cuando se invoca en la terminal en este orden, SIGINT no se pasa de gdb a openocd. Sin embargo, si esta misma invocación estaba en un script bash, se pasa el SIGINT.
Cualquier ayuda sería muy apreciada.
PD: este problema está en OS X, pero estoy tratando de usar herramientas que también son portátiles para todas las herramientas de Unix.
nohup
No es la respuesta correcta. Debe agregar algún pseudocódigo o código de ejemplo para mostrar con mayor precisión lo que desea.screen
?Respuestas:
Para separar un proceso de un script bash:
Si detiene su script bash con
SIGINT
(ctrl + c), o el shell sale del envío,SIGHUP
por ejemplo, el proceso no será molestado y continuará ejecutándose normalmente.stdout
Ystderr
será redirigido a un archivo de registro:nohup.out
.Si desea ejecutar un comando separado mientras puede ver la salida en el terminal, utilice
tail
:fuente
nohup
necesario? ¿Cuál es la diferencia entrenohup COMMAND &
yCOMMAND &
si su objetivo es solo ejecutar el comando en segundo plano y liberar el terminal?Para mí esto funciona perfectamente bien con Disown
fuente
La solución que encontré involucra un programa llamado 'separar' escrito por Annon Inglorion y descargable desde su sitio web
Una vez compilado, se puede usar en un script de la siguiente manera:
Esta primera línea crea un nuevo proceso (ejecutando openocd) y almacena la identificación del proceso en el archivo (debug.pid) para su uso posterior. Esto evita los problemas con grepping para el pid como se proporciona en la respuesta de Oliver. Al salir del siguiente programa de bloqueo (gdb), el archivo que almacena el pid se usa para eliminar el proceso separado directamente.
fuente
detach
hace maravillas.Una solución simple y portátil:
Algunas advertencias de portabilidad: ¡las
ps
opciones dependen del sistema operativo! en su lugar podría utilizar una variante de:{ ps -ef || ps aux ;} | grep '[o]penocd | cut -f 1
.at
no pudo estar disponible (raro, pero esto sucede ...).$(...)
necesita un caparazón no muy viejo, de lo contrario, use backticks.fuente
at
inicie un script que inicie el programa y dé su pid en su lugar en un archivo, y haga que el script principal espere eso archivo para aparecer y luego leer el pid de él.