Tengo un script de shell script.shcon un comando cmdiniciado en segundo plano, es decir:
#!/bin/bash
…
cmd &
…
Si abro un emulador de terminal (he intentado xfce4-terminal y gnome-terminal) y ejecuto script.shdentro, mi comando cmdse ejecuta efectivamente y se ejecuta en segundo plano, como se esperaba.
Pero, si abro un emulador de terminal del anterior (o al comienzo de mi sesión de escritorio, que es mi caso de uso real), y ejecuto mi script por
xfce4-terminal -H -x script.sh (or gnome-terminal -x script.sh)
el comando cmdya no se ejecuta.
Descubrí que puedo forzar que se ejecute al agregar set -mmi script, pero no entiendo por qué es necesario (ni suficiente, en realidad) en este caso, y no en el anterior. De hecho, si pongo un set -oen mi script, obtengo el mismo resultado en ambos casos.
¿Alguien puede explicarme esto y / o decirme la forma correcta de proceder con trabajos en segundo plano en scripts de shell? ¡Gracias!
EDITAR: En realidad, cmdse ejecuta en ambos casos, pero en el segundo, se elimina inmediatamente por la terminación de script.sh. Para evitar esto, uno puede usar nohup, pero no es suficiente, y es lo más extraño para mí: uno también tiene que poner sleep 1, o algo así, para permitir que el proceso se inicie correctamente en segundo plano y se disocie del shell principal, de lo contrario también se mata.
Realmente no entiendo esta diferencia de comportamiento entre los dos shells, ya que ambos no son interactivos, como se indicó en un comentario anterior.
cmdalgo que se puede ver en un administrador de tareas, como sleep ncon lo nsuficientemente grande. Pero uno puede elegir algo con una GUI, como firefoxu otra cosa.
cmdque no se está ejecutando? ¿Se encuentra de manera fácil y única en la salida de ps (y dura lo suficiente como para encontrarlo), o hace un sonido u otra indicación de GUI?