Hitting Enter the script ends the process remains in the background.
Quase! Na verdade, o script já saiu quando você pressionou Enter . No entanto, é assim que você pode obter seu prompt de volta (porque seu shell imprime seu $PS1
novamente).
O motivo pelo qual pressionar Ctrl + C termina os dois é porque os dois estão vinculados. Quando você executa seu script, seu shell inicia um subshell para executá-lo. Quando você termina este subshell, seu processo em background morre, provavelmente de um sinal SIGHUP
.
Separe o script, o processo em segundo plano e a subshell
Usando nohup
, talvez você consiga se livrar desse pequeno inconveniente.
#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
nohup $cmd &
A alternativa disown
Se você puder alternar de /bin/sh
para /bin/bash
, experimente também disown
. Para saber mais, basta digitar help disown
em uma instância bash
.
disown -h $cmd &
Matando o processo em segundo plano "bem"
Agora, quando se trata de matar seu processo, você pode perfeitamente fazer um " Ctrl + C " usando kill
. Apenas não envie um brutal SIGKILL
. Em vez disso, você poderia usar:
$ kill -2 [PID]
$ kill -15 [PID]
O qual enviará% niceSIGINT
(2) ou SIGTERM
(15) ao seu processo. Você também pode querer imprimir o valor PID depois de iniciar o processo:
...
nohup $cmd &
echo $!
... ou melhor ainda, faça o script esperar por um SIGINT
e envie-o de volta para o processo em segundo plano (isso manterá seu script em primeiro plano) :
#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
nohup $cmd &
# Storing the background process' PID.
bg_pid=$!
# Trapping SIGINTs so we can send them back to $bg_pid.
trap "kill -2 $bg_pid" 2
# In the meantime, wait for $bg_pid to end.
wait $bg_pid
Se um SIGINT
não for suficiente, use apenas SIGTERM
(15):
trap "kill -15 $bg_pid" 2 15
Dessa forma, quando seu script recebe um SIGINT
( Ctrl + C , kill -2
) ou um SIGTERM
enquanto wait
ing para o plano de fundo processo, apenas transmitirá os sinais para ele. Se esses sinais matarem a instância de sfk
, a chamada wait
retornará, encerrando seu script também:)