Meilleur moyen de faire un script shell daemon?
Je me demandais si il ya une meilleure façon de faire un démon qui attend quelque chose en utilisant uniquement des poissons que:
#! /bin/sh
trap processUserSig SIGUSR1
processUserSig() {
echo "doing stuff"
}
while true; do
sleep 1000
done
En particulier, je me demandais si il y a moyen de se débarrasser de la boucle et ont encore la chose, écouter pour que les signaux.
- Vous aurez besoin d'une boucle, mais notez que votre exemple n'est probablement pas exécuter dans la façon dont vous vous attendez. Le sommeil n'est pas une commande interne du shell, et un signal SIGUSR1 reçu par le shell n'est pas propagée aux processus enfants. Ainsi, votre gestionnaire de signal n'obtiendrez pas traitée jusqu'à ce que le sommeil est fini. Voir mywiki.wooledge.org/SignalTrap#preview, la 3e section.
Vous devez vous connecter pour publier un commentaire.
Utilisation de votre système de démon de l'installation, comme les start-stop-daemon.
Sinon, oui, il y a une boucle quelque part.
Juste la semi-finition de votre script (
./myscript &
) ne sera pas daemonize il. Voir http://www.faqs.org/faqs/unix-faq/programmer/faq/, section 1.7, qui décrit ce qui est nécessaire pour devenir un démon. Vous devez le débrancher de la terminal, de sorte queSIGHUP
ne pas le tuer. Vous pouvez prendre un raccourci pour faire un script semblent agir comme un démon;va faire le travail. Ou, pour saisir à la fois stderr et stdout vers un fichier:
Cependant, il y a peut être encore des aspects importants que vous devez considérer. Par exemple:
chdir("/")
(oucd /
à l'intérieur de votre script), et la fourche de sorte que le parent quitte, et donc l'original descripteur de fichier est fermé.umask 0
. Vous ne voulez pas dépendre sur le umask de l'appelant du démon.Pour un exemple de script qui prend l'ensemble de ces aspects en compte, voir Mike S' répondre.
0<&-
faire? Il n'est pas évident ce que la séquence de caractères accomplit.0<&-
est censé faire. J'ai trouvé ce lien qui explique cela.0<&-
est soit. C'est très bizarre, et quelque chose que je n'ai jamais vu avant. Normalement, un descripteur de fichier serait fermé par quelque chose comme5>&-
. Donc, cela semble être la conclusion de fd0, mais il peut être une faute de frappe.0<&-
ferme stdin (fd, 0). De cette façon, si votre processus accidentellement lit l'entrée standard stdin (facile à faire), il obtiendra un message d'erreur au lieu de s'accrocher pour toujours en attente pour les données à afficher.disown $!
pour empêcher le shell interactif de clôture (lors de la déconnexion ou de script parent de sortie) à partir de l'envoi d'un signal à l'nohup processus et de le tuer.Certains de haut-upvoted réponses ici sont absents une partie importante de ce qui fait un démon, un démon, par opposition à un processus d'arrière-plan, ou d'un processus en arrière-plan détaché à partir d'un shell.
Ce http://www.faqs.org/faqs/unix-faq/programmer/faq/ décrit ce qui est nécessaire pour être un démon. Et ce Exécuter script bash en tant que démon met en œuvre le setsid, mais il manque le chdir à la racine.
L'affiche originale de la question était en fait plus précis que "Comment puis-je créer un processus démon à l'aide de bash?", mais puisque le sujet et les réponses discuter daemonizing scripts shell en général, je pense que c'est important de le signaler (pour les intrus comme moi à la recherche sur les petits détails de la création d'un démon).
Voici ma version d'un script shell qui allait se comporter selon la FAQ. Set de DÉBOGAGE pour
true
de voir assez de sortie (mais il permet également de quitter immédiatement plutôt que de faire une boucle sans fin):De sortie ressemble à ceci lorsque
DEBUG
est fixé àtrue
. Remarquez comment la session et le processus de l'ID de groupe (SESS, PGID) les numéros de changement:fork()' so the parent can exit, this returns control to the command line or shell invoking your program. ... 2.
setsid () "pour devenir un groupe de processus et de la session de chef de groupe ... notre processus de maintenant n'a pas de terminal de contrôle, ce qui est une Bonne Chose pour les démons... 3. "fork ()" de nouveau de sorte que le parent ... peut quitter. Cela signifie que nous, en tant que non-session chef de groupe, ne peut jamais retrouver un terminal de contrôle."stdin
,stdout
,stderr
. Du moins pas avecsh
.~/doit.sh
:for i in seq 1 2 3 4 5; do echo Hello $i; sleep 1; done
. Maintenant l'exécuter:(/bin/bash ~/doit.sh &) &
. Il se fera un plaisir de l'écho à votre ats. En outre, le linux magazine article ne couvre même pas le détachement de l'ats de la partie. Étrangement, ils ont un lien de la FAQ, mais ignorer les choses qui les rend un démon, un démon (par opposition à un processus lancé en arrière-plan), puis de prêter à confusion, appeler un démon. Encore plus étrange, ils commencent ok et même appeler son script de "démon-like" mais alors, ils courent sur les rails.Cela dépend vraiment sur quel est le binaire lui-même va faire.
Par exemple je veux créer une certaine écoute.
Le départ Démon est une tâche simple :
lis_deamon :
c'est la façon dont nous lancer le démon (voie commune pour tous /etc/init.d/personnel)
maintenant, comme pour le port d'écoute de soi,
Ça doit être une sorte de boucle/alerte ou d'autre qui déclenche le script
pour faire ce que tu veux. Par exemple, si u veux votre script pour dormir 10 min
et réveillez-vous et demandez-vous comment vous faites u va le faire avec le
Voici le simple auditeur que u peut le faire qui sera à l'écoute de votre
commandes à partir de l'ordinateur distant et de les exécuter sur local :
auditeur :
Afin de le lancer : /tmp/deamon_test/auditeur commencer
et d'envoyer des commandes de shell (ou de l'envelopper de script) :
Espère que cela aidera.
Regarder le démon de l'outil à partir de la libslack package:
http://ingvar.blog.linpro.no/2009/05/18/todays-sysadmin-tip-using-libslack-daemon-to-daemonize-a-script/
Sur Mac OS X, utilisez un launchd script shell daemon.
Si j'avais un
script.sh
et j'ai voulu l'exécuter à partir de bash et de le laisser tourner même quand je veux fermer ma session bash, alors je voudrais combinernohup
et&
à la fin.exemple:
nohup ./script.sh < inputFile.txt > ./logFile 2>&1 &
inputFile.txt
peut être n'importe quel fichier. Si votre fichier ne possède pas d'entrée puis nous avons l'habitude d'utiliser/dev/null
. Donc, la commande serait:nohup ./script.sh < /dev/null > ./logFile 2>&1 &
Après que près de votre bash session,ouvrez un autre terminal et exécutez:
ps -aux | egrep "script.sh"
et vous verrez que votre script est encore en cours d'exécution en arrière-plan. De cource,si vous voulez l'arrêter puis exécuter la même commande (ps) etkill -9 <PID-OF-YOUR-SCRIPT>
Voir Bash Gestionnaire de Service projet: https://github.com/reduardo7/bash-service-manager
Exemple de mise en œuvre
Exemple d'utilisation
$ ( cd /; umask 0; setsid your_script.sh </dev/null &>/dev/null & ) &
Comme beaucoup de réponses ce n'est pas du "vrai" daemonization mais plutôt une alternative à
nohup
approche.Il y a évidemment des différences de l'aide
nohup
. Pour l'une il n'existe pas de se détacher de la mère en premier lieu. Aussi "script.sh" ne pas hériter d'un parent de l'environnement.En aucun cas cela est une meilleure alternative. C'est simplement un autre (et un peu paresseux) manière de lancer des processus en arrière-plan.
P. S. personnellement, je upvoted carlo répondre comme il semble être le plus élégant et travaille à la fois à partir de la borne et à l'intérieur de scripts
essayez d'exécuter à l'aide de &
si vous enregistrez ce fichier en tant que program.sh
vous pouvez utiliser