Hacer que el proceso hijo generado con system () siga ejecutándose después de que el padre reciba señales de muerte y salga

En una biblioteca de Linux / C ++ estoy iniciando un proceso a través de la llamada a system (),

system("nohup processName > /dev/null&"); 

Esto parece funcionar bien con una aplicación de prueba simple que se ejecuta por sí sola, pero si uso esto desde el interior de una extensión Nodejs / V8 que recibe una señal de muerte, el proceso secundario se anula. Encontré que corriendo,

 system("sudo nohup processName > /dev/null&"); 

Con el archivo sudoers configurado para no requerir una contraseña, los gestores pueden hacer que se ejecute incluso cuando el proceso principal (nodo) finaliza. ¿Hay alguna forma de separar por completo el proceso hijo para que las señales enviadas al padre y al padre que sale ya no tengan efecto en el niño? Preferiblemente, dentro del sistema () llame y no algo que requiera obtener el ID de proceso y hacer algo con él.

El procedimiento para separarse del proceso principal es simple: ejecute el comando bajo setsid (para que comience en una nueva sesión), redireccionando la entrada, salida y error estándar a /dev/null (o en otro lugar, según corresponda), en el fondo de una subshell. Debido a que system() inicia una nueva shell, es equivalente a una subshell, por lo que

 system("setsid COMMAND /dev/null 2>/dev/null &"); 

hace exactamente lo que se necesita. En un script de shell, el equivalente es

 ( setsid COMMAND /dev/null 2>/dev/null & ) 

(Los scripts de shell necesitan una subshell, porque de lo contrario el COMMAND estaría bajo el control del trabajo para el shell actual. Eso no es importante cuando se usa system() , porque de todos modos comienza un nuevo shell solo para el comando; el shell se cerrará cuando el comando salidas.)

Las redirecciones son necesarias para asegurarse de que el COMMAND no tenga descriptores abiertos para el terminal actual. (Cuando el terminal se cierra, se envía una señal TERM a todos estos procesos). Esto significa que la entrada estándar, la salida estándar y el error estándar deben ser redirigidos. Las redirecciones anteriores funcionan en shells Bash y POSIX, pero pueden no funcionar en versiones antiguas de /bin/sh . En particular, debería funcionar en todas las distribuciones de Linux.

setsid comienza una nueva sesión; el COMMAND convierte en el líder del grupo de procesos para su propio grupo de procesos. Las señales pueden dirigirse a un solo proceso oa todos los procesos en un grupo de procesos. Las señales de terminación generalmente se envían a grupos de procesos completos (ya que una aplicación puede consistir técnicamente en múltiples procesos relacionados). Al iniciar una nueva sesión, se asegura de que COMMAND no se anule si el grupo de proceso al que pertenece el proceso principal es anulado por una señal de todo el grupo de proceso.

Mi conjetura es que todo el grupo de proceso está siendo asesinado. Puede probar setpgid en el niño para iniciar un nuevo grupo de procesos. El primer paso debe ser deshacerse del system y usar fork y execve o posix_spawn .