Forum Linux.général Script ne se comportant pas pareil selon le mode de lancement

Posté par  . Licence CC By‑SA.
Étiquettes :
2
30
avr.
2017

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  . Évalué à -6. Dernière modification le 01 mai 2017 à 11:52.

    :/ :\

  • # RTFM ;-)

    Posté par  . Évalué à 9.

    Salut,

    c'est normal et c'est indiqué dans man su:

    -c, --command COMMANDE
    Indiquer une commande qui sera invoquée par l'interpréteur de
    commandes en utilisant son option -c
    La commande exécutée n'aura aucun terminal de contrôle. Cette
    option ne peut pas être utilisée pour exécuter des programmes
    interactifs qui ont besoin d'un terminal de contrôle.

    • [^] # Re: RTFM ;-)

      Posté par  . É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  . É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.