Je voudrais exécuter et configurer un processus de manière similaire à un démon à partir d'un script.
Mon shell est émulé en zsh sous Cygwin et le démon est SFK , un serveur FTP de base.
Pour ce qui compte ici, le script startserv.sh
peut être rédigé comme suit:
#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
$cmd &
Après avoir exécuté le script startserv.sh
, il s'arrête (se termine?) Sans afficher aucune invite, puis:
CTRL+ Ctermine à la fois le script et le processus de tâche en arrière-plan;
Frapper Enterle script met fin au processus reste en arrière-plan.
Quoi qu'il en soit, je ne peux le voir que via ps
et non jobs
, donc, quand je veux terminer le processus, je dois envoyer un kill -9
signal brutal , ce que j'aimerais éviter en faveur de CTRL+ C.
Une alternative serait d' exécuter l'intégralité du script en arrière-plan. 'Serait', mais la read
commande ne peut pas obtenir l'entrée utilisateur si le script est exécuté en tant que startserv.sh &
.
Notez que j'ai besoin d'un serveur éphémère, pas d'un vrai démon : c'est-à-dire que je veux que le processus serveur s'exécute en arrière-plan, une fois le script terminé, pour effectuer de simples tâches de shell interactif (avec un invité de machine virtuelle), mais je ne ' t besoin du processus pour survivre à la coquille; ne nohup
semble donc pas approprié.
bgproc="$!"
, puiscommand "$bgproc"
prendre l'action appropriée. Voir aussi stackoverflow.com/questions/1908610/…Réponses:
Presque! En fait, le script est déjà terminé au moment où vous appuyez sur Enter. Cependant, c'est ainsi que vous pouvez récupérer votre invite (car votre shell imprime
$PS1
à nouveau son intégralité).La raison pour laquelle le fait d'appuyer sur Ctrl+ Cmet fin aux deux est parce que les deux sont liés. Lorsque vous exécutez votre script, votre shell lance un sous-shell dans lequel l'exécuter. Lorsque vous terminez ce sous-shell, votre processus d'arrière-plan meurt, probablement à cause d'un
SIGHUP
signal.Séparez le script, le processus d'arrière-plan et le sous-shell
En utilisant
nohup
, vous pourrez peut-être vous débarrasser de ce petit inconvénient.L'
disown
alternativeSi vous pouvez passer de
/bin/sh
à/bin/bash
, vous pouvez également essayerdisown
. Pour en savoir plus, tapez simplementhelp disown
unebash
instance.Tuer le processus d'arrière-plan "bien"
Maintenant, quand il s'agit de tuer votre processus, vous pouvez parfaitement faire un " Ctrl+ C" en utilisant
kill
. N'envoyez pas de brutalSIGKILL
. Au lieu de cela, vous pouvez utiliser:Ce qui enverra un joli
SIGINT
(2) ouSIGTERM
(15) à votre processus. Vous pouvez également vouloir imprimer la valeur PID après avoir démarré le processus:... ou encore mieux, faites attendre le script pour un
SIGINT
, et renvoyez-le au processus d'arrière-plan (cela gardera votre script au premier plan) :Si un
SIGINT
ne suffit pas, utilisez simplement un à laSIGTERM
place (15):De cette façon, lorsque votre script reçoit un
SIGINT
( Ctrl+ C,kill -2
) ou unSIGTERM
certain tempswait
pour le processus d'arrière-plan, il ne fait que lui transmettre les signaux. Si ces signaux tuent l'sfk
instance, alors l'wait
appel reviendra, mettant ainsi fin à votre script :)la source
jobs
dans le terminal après la fin du script (au lieu deps
).pid -p
).wait
). Si vous supprimez l'attente, la gestion du signal est rompue: /