Eu gostaria de executar e configurar um processo de maneira semelhante a um daemon a partir de um script.
Meu shell é zsh emulado no Cygwin e o daemon é o SFK , um servidor FTP básico.
Para o que importa aqui, o script startserv.sh
pode ser redigido da seguinte maneira:
#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
$cmd &
Depois de executar o script startserv.sh
, ele pára (termina?) Sem mostrar nenhum prompt e, em seguida:
CTRL+ Ctermina o script e o processo de trabalho em segundo plano;
Ao pressionar Entero script, o processo permanece em segundo plano.
De qualquer forma, só posso vê-lo via ps
e não jobs
, então, quando quero fechar o processo, tenho que enviar um kill -9
sinal brutal , algo que gostaria de evitar em favor do CTRL+ C.
Uma alternativa seria executar o script inteiro em segundo plano. 'Seria', mas o read
comando não pode obter a entrada do usuário se o script for executado como startserv.sh &
.
Observe que preciso de um servidor efêmero, não um daemon verdadeiro : ou seja, desejo que o processo do servidor seja executado em segundo plano, após o término do script, para executar tarefas simples de shell interativas (com um convidado da máquina virtual), mas não não precisa do processo para sobreviver à concha; portanto, nohup
não parece apropriado.
bgproc="$!"
e, em seguida,command "$bgproc"
execute a ação apropriada. Veja também stackoverflow.com/questions/1908610/…Respostas:
Quase! Na verdade, o script já saiu quando você pressiona Enter. No entanto, é assim que você pode recuperar seu prompt (porque seu shell imprime
$PS1
tudo novamente).A razão pela qual pressionar Ctrl+ Cencerra os dois é porque os dois estão vinculados. Quando você executa seu script, seu shell inicia um subshell no qual executá-lo. Quando você encerra esse subshell, seu processo em segundo plano morre, provavelmente por um
SIGHUP
sinal.Separe o script, o processo em segundo plano e o subshell
Usando
nohup
, você poderá se livrar desse pequeno inconveniente.A
disown
alternativaSe você pode alternar de
/bin/sh
para/bin/bash
, também pode tentardisown
. Para saber mais, basta digitarhelp disown
umabash
instância.Matando o processo em segundo plano "bem"
Agora, quando se trata de matar o seu processo, você pode perfeitamente fazer um " Ctrl+ C" usando
kill
. Apenas não envie um brutalSIGKILL
. Em vez disso, você pode usar:O que enviará um bom
SIGINT
(2) ouSIGTERM
(15) para o seu processo. Você também pode imprimir o valor do PID após iniciar o processo:... ou melhor ainda, faça com que o script aguarde um
SIGINT
e envie-o de volta ao processo em segundo plano (isso manterá seu script em primeiro plano) :Se um
SIGINT
não for suficiente, basta usar umSIGTERM
(15):Desta forma, quando seu script recebe uma
SIGINT
( Ctrl+ C,kill -2
) ou umSIGTERM
enquantowait
ing para o processo de fundo, ele só vai retransmitir os sinais para ele. Se esses sinais matarem asfk
instância, await
chamada retornará, encerrando seu script também :)fonte
jobs
no terminal após o término do script (em vez deps
).pid -p
).wait
). Se você remover a espera, o processamento do sinal será interrompido: /