Como executar um script de shell sem terminal

1

Eu tenho um comando shell que executa um comando e o envia através do pipe para um arquivo python. O arquivo python faz várias verificações e, em seguida, inicia processos com parâmetros usando subprocess.Popen. Mas vejo que isso só funciona quando eu executo a coisa toda em uma concha. Existe outra maneira de eu executar isso além de shell. Se eu apenas executar sem shell ou usar & para mantê-lo em segundo plano, os processos iniciados pelo python são nomeados extintos na tabela ps -e. Alguém pode ajudar?

EDITAR:

Aqui está o run.sh, que eu executo:

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

No entanto, nem todos os subprocess.popen não são executados. Por exemplo, se eu usar o programa do festival, ele será executado. No entanto, o xbacklight não.

isto é getcommand.py:

Eu removi a parte desnecessária, e esta que é necessária, com string, eu sei que esta seleção está indo bem.:

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()

Agora chegando aos objetos, é assim que a classe vai:

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])
    
por user1652263 01.05.2013 / 11:21

1 resposta

1

Quando você executa um script sem um console, está fazendo isso com o ambiente de sessão gráfica.

Crie um arquivo chamado testenv.sh com estas linhas:

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

Coloque o arquivo no mesmo diretório do seu script. Execute-o a partir da sessão gráfica. Abra o arquivo, salve-o em outro lugar. Em seguida, execute o arquivo a partir de um terminal e compare a saída.

Provavelmente, o problema aqui é o PWD . Você está confiando no script que está sendo executado no mesmo diretório em que você está, mas todos os scripts executados com o ambiente de sessão gráfica são executados com o PWD definido no seu diretório inicial.

Também pode ser um problema com seu script sem shebang .

    
por Jorge Suárez de Lis 01.05.2013 / 11:31