Me gustaría ejecutar y configurar un proceso similar a un demonio de un script.
Mi shell está emulado zsh bajo Cygwin y el demonio es SFK , un servidor FTP básico.
Para lo que importa aquí, el script startserv.shse puede redactar de la siguiente manera:
#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
$cmd &
Después de ejecutar el script startserv.sh, se detiene (¿finaliza?) Sin mostrar ningún mensaje, luego:
CTRL+ Cfinaliza tanto el script como el proceso de trabajo en segundo plano;
Al presionar Enterel script, el proceso permanece en segundo plano.
De todos modos, puedo verlo solo a través psy no jobs, así que, cuando quiero cerrar el proceso, tengo que enviar una kill -9señal brutal , que es algo que me gustaría evitar a favor de CTRL+ C.
Una alternativa sería ejecutar todo el script en segundo plano. 'Sería', pero el readcomando no puede obtener la entrada del usuario si el script se ejecuta como startserv.sh &.
Tenga en cuenta que necesito un servidor efímero, no un verdadero demonio : es decir, quiero que el proceso del servidor se ejecute en segundo plano, después de que finalice el script, para realizar tareas de shell interactivas simples (con un invitado de máquina virtual), pero no lo hago ' No necesita el proceso para sobrevivir al caparazón; Por lo tanto, nohupno parece apropiado.

bgproc="$!"y luegocommand "$bgproc"para tomar la acción adecuada. Ver también stackoverflow.com/questions/1908610/…Respuestas:
¡Casi! En realidad, el guión ya ha salido cuando presionas Enter. Sin embargo, así es como puede recuperar su solicitud (porque su shell imprime
$PS1todo de nuevo).La razón por la cual presionar Ctrl+ Ctermina a ambos es porque los dos están vinculados. Cuando ejecuta su script, su shell inicia un subshell en el que ejecutarlo. Cuando termina esta subshell, su proceso en segundo plano muere, probablemente por una
SIGHUPseñal.Separe el script, el proceso en segundo plano y la subshell
Con el uso
nohup, puede deshacerse de este pequeño inconveniente.La
disownalternativaSi puede cambiar de
/bin/sha/bin/bash, también puede intentarlodisown. Para saber más, simplemente escribahelp disownunabashinstancia.Matar el proceso de fondo "muy bien"
Ahora, cuando se trata de matar su proceso, puede hacer un " Ctrl+ C" perfectamente
kill. Simplemente no envíes un brutalSIGKILL. En cambio, podría usar:Lo que enviará un agradable
SIGINT(2) oSIGTERM(15) a su proceso. También es posible que desee imprimir el valor PID después de comenzar el proceso:... o incluso mejor, haga que la secuencia de comandos espere a
SIGINT, y envíela de nuevo al proceso en segundo plano (esto mantendrá su secuencia de comandos en primer plano) :Si a
SIGINTno es suficiente, solo use aSIGTERMen su lugar (15):De esta manera, cuando su script recibe un
SIGINT( Ctrl+ C,kill -2) o unSIGTERMtiempowaitpara el proceso en segundo plano, solo le transmitirá las señales. Si estas señales matan lasfkinstancia, entonces lawaitllamada volverá, por lo que también terminará su secuencia de comandos :)fuente
jobsen el terminal después de que finaliza el script (en lugar deps).pid -p).wait). Si elimina la espera, se interrumpe el manejo de la señal: /