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:)