web-dev-qa-db-fra.com

Comment exécuter un script Shell sans terminal

J'ai une commande Shell qui exécute une commande et l'envoie via un tube vers un fichier python. Le fichier python effectue plusieurs vérifications dessus, puis démarre les processus avec paramètres en utilisant subprocess.Popen. Mais je vois que cela ne fonctionne que lorsque j'exécute la chose entière dans un shell. Existe-t-il une autre façon de l'exécuter autre que Shell. Si je l'exécute sans aucun shell ou que j'utilise & pour le garder en arrière-plan, les processus démarrés par python sont nommés disparus dans la table ps -e. Quelqu'un peut-il aider?

ÉDITER:

Voici run.sh, que je lance:

#!/bin/bash
padsp julius -input mic -C $HOME/project/julius-grammer/julian.jconf | python -u $HOME/project/pythonControls/getcommand.py

Cependant, tous les sous-processus.popen ne fonctionnent pas. Par exemple, si j'utilise le programme du festival, il s'exécute. Ce n'est pas le cas de xbacklight.

c'est getcommand.py:

J'ai supprimé la partie inutile, et celle-ci qui est nécessaire, com est string, je sais que cette sélection se passe bien .:

if(com == "COMPLETE BRIGHTNESS"):
    userin = Data(["xbacklight", "-set", "100"],"Maximum brightness")
    userin.interact()
if(com == "HALF BRIGHTNESS"):
    userin = Data(["/usr/bin/xbacklight", "-set", "50"],"Partial brightness")
    userin.interact()
if(com == "ZERO BRIGHTNESS"):
    userin = Data(["/usr/bin/xbacklight","-set", "0"],"Minimal brightness")
    userin.interact()

Venons-en maintenant aux objets, voici comment va la classe:

class Data:
    def __init__(self, com="", msg="", sp="False"):
        self.command = com
        self.message = msg
        self.speak = sp
    def interact(self):
        if self.command != "":
            co = subprocess.Popen(self.command,stdout=subprocess.PIPE)
            co.wait()
        if self.speak == True:
            self.say(self.message)
        else:
            subprocess.Popen(["notify-send","SysSec", self.message])
1
user1652263

Lorsque vous exécutez un script sans console, vous le faites avec l'environnement de session graphique.

Créez un fichier nommé testenv.sh avec ces lignes:

#!/bin/bash
enc > ~/testenv.txt

Placez le fichier dans le même répertoire que votre script. Exécutez-le à partir de la session graphique. Ouvrez le fichier, enregistrez-le ailleurs. Exécutez ensuite le fichier à partir d'un terminal et comparez la sortie.

Il y a de fortes chances que le problème ici soit le PWD. Vous comptez sur le script exécuté sur le même répertoire que celui dans lequel vous vous trouvez, mais tous les scripts exécutés avec l'environnement de session graphique sont exécutés avec le paramètre PWD dans votre répertoire personnel.

Cela pourrait également être un problème avec votre script sans Shebang .