Les commandes d’exécution de script shell créent plusieurs processus

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
  • le processus su a probablement terminé tout nettoyage par ce point et quitte (presque instantanément à l’observation humaine)
  • Vous exécutez ensuite 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.