J’ai le script bash suivant:
COMMAND="python myservice.py start" su root -c "$COMMAND" & exit 0
Quand je lance le script et fais
ps ax | grep myservice
J’ai trois processus en cours:
4311 su root -c python myservice.py start 4421 /bin/bash -c python myservice.py start 4456 python myservice.py start
Je me demandais pourquoi trois processus sont créés?
Lorsque je change mon script comme suit:
COMMAND="python myservice.py start" su root -c "/bin/bash -c \"$COMMAND"\" & " &
J’obtiens deux processus en cours d’exécution:
5121 /bin/bash -c python myservice.py start 4793 python myservice.py start
J’étais sous l’impression d’append et pour la première commande su va tuer le processus une fois que la commande est exécutée. Je ne suis pas sûr où / bin / bash -c python myservice.py processus de démarrage est créé.
Y a-t-il de toute façon des solutions possibles? Comment puis-je changer le nom du processus pour qu’il ressemble à ceci:
4793 myservice
par opposition à
4793 python myservice.py start
comme c’est maintenant.
Merci d’avance.
Dans votre premier scénario, je suppose qu’il est clair que les processus su
et python
existent, et vous ne savez pas pourquoi le processus bash
existe. De la page de manuel su
:
-c, --command COMMAND Specify a command that will be invoked by the shell using its -c.
La réponse simple est que ce processus shell bash est démarré simplement parce que la documentation le dit. Cependant, je soupçonne que la raison en est que cela vous permet de passer des commandes complexes à su
(par exemple, y compris les pipes, les redirections, les shell-intégrées, etc.).
Il serait possible pour su
faire un appel et d’appeler simplement l’appel système execve()
pour un chemin de programme et des arguments donnés, mais beaucoup de fonctionnalités shell seraient perdues si c’était le cas – ou vous devriez appeler explicitement su root -c "/bin/bash -c
Dans votre deuxième scénario, les événements suivants se produisent:
su
commence et est mis en arrière-plan su
lance un processus bash
et le met en arrière-plan bash
démarre un processus python
su
a probablement terminé tout nettoyage par ce point et quitte (presque instantanément à l’observation humaine) ps
et observez les processus bash
et python
toujours en cours d’exécution Si vous souhaitez uniquement voir le processus python
cours d’exécution, il vous suffit de vous assurer que l’opérateur &
control se trouve dans la commande citée passée à su
:
su root -c "$COMMAND &"
Cet appel:
su root -c "$COMMAND" &
met la commande su
en arrière-plan. Je ne sais pas ce que contient votre script python, mais si vous l’exécutez en boucle, cela signifie que le su que vous avez placé en arrière-plan ne sera PAS renvoyé tant que la commande que vous avez transmise ne sera pas renvoyée. Je suppose que depuis que vous start
votre script, il peut être exécuté comme un processus démon qui ne retourne pas immédiatement.
Vous avez trois processus car le su ne se ferme pas tant que votre python continue à s’exécuter.
Le second fonctionne comme prévu car vous mettez en arrière-plan la commande qui a été transmise à su
afin qu’elle retourne immédiatement à su
, donc le su
arrière-plan peut retourner. De plus, vous n’avez pas besoin de la sortie.