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.sh
se 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 ps
y no jobs
, así que, cuando quiero cerrar el proceso, tengo que enviar una kill -9
señ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 read
comando 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, nohup
no 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
$PS1
todo 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
SIGHUP
señal.Separe el script, el proceso en segundo plano y la subshell
Con el uso
nohup
, puede deshacerse de este pequeño inconveniente.La
disown
alternativaSi puede cambiar de
/bin/sh
a/bin/bash
, también puede intentarlodisown
. Para saber más, simplemente escribahelp disown
unabash
instancia.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
SIGINT
no es suficiente, solo use aSIGTERM
en su lugar (15):De esta manera, cuando su script recibe un
SIGINT
( Ctrl+ C,kill -2
) o unSIGTERM
tiempowait
para el proceso en segundo plano, solo le transmitirá las señales. Si estas señales matan lasfk
instancia, entonces lawait
llamada volverá, por lo que también terminará su secuencia de comandos :)fuente
jobs
en 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: /