Alors voilà. J’ai un script Python qui ne fork pas mais qui ne se termine pas (while true { do things; sleep }), lorsque je le lance en tant qu’utilisateur ainsi :
$ /path/to/python /path/to/script.py
le programme s’exécute bien au premier plan. Par contre, lorsque que je le lance ainsi (en étant root) :
# su - c '/path/to/python /path/to/script.py' user
le programme fork… Je ne comprends pas pourquoi et c’est pour ça que je fais appel à vous.
Je me suis rendu compte de ce comportement en écrivant l’unit systemd du bousin. J’ai choisi Type=simple (c’est comme ça que je fais pour d’autres scripts qui fonctionnent pareil, sans problème…), j’ai mis un Restart et celui-ci a lieu.
Je viens de tester comme on me l’a conseillé avec une unit Type=forking mais là ça fonctionne comme attendu : un systemctl start truc.service
lance le script et ne me rend pas la main.
À toute fin utile, une particularité de ce script est qu’il utilise les bibliothèques Python requests et multiprocessing avec une fonction globale ainsi écrite (je n’ai pas écrit la fonction, seulement le commentaire) :
from multiprocessing import Pool
# http://stackoverflow.com/questions/32955846/in-python-is-there-an-async-equivalent-to-multiprocessing-or-concurrent-futures
#
# asyncio: not working (because my Post object is unhashable (it’s a list))
# gevent: not in the stdlib
#
# The chosen method, multiprocessing, may become a problem if you plan to federate thousands of pilings !
def async_map(f, iterable):
with Pool(len(iterable)) as p:
return p.map(f, iterable)
Pour résumer : quelle peut être la cause d’une différence de comportement d’un programme entre le lancer ainsi $ prog
, ou ainsi # su -c 'prog' user
?
# :/ :\
Posté par rider74 . Évalué à -6. Dernière modification le 01 mai 2017 à 11:52.
:/ :\
# RTFM ;-)
Posté par kp . Évalué à 9.
Salut,
c'est normal et c'est indiqué dans man su:
[^] # Re: RTFM ;-)
Posté par Marotte ⛧ . Évalué à 3.
Juste. Merci.
Maintenant je sais pour su… Est-ce que ça pourrait pas être ça justement qui fait perdre les pédales à systemd, ce serait étonnant :/
Bon. Je sens qu’il me reste à tester en créant un unit utilisateur… m’enfin si ça fonctionne comme ça je ne comprends pas trop à quoi sert la variable User= pour un unit (system) Type=simple…
J’essaierai de mettre à jour ce thread si j’arrive à avancer sur le sujet.
# Mea culpa
Posté par Marotte ⛧ . Évalué à 3.
C’est mon programme qui devait avoir (ou a) un problème. Ça fonctionne correctement là.
J’aurais au moins appris quelque chose sur su au passage.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.