如何在没有终端的情况下运行 shell 脚本

如何在没有终端的情况下运行 shell 脚本

我有一个 shell 命令,它执行一个命令并通过管道将其发送到 python 文件。python 文件对其进行各种检查,然后使用 subprocess.Popen 启动带有参数的进程。但我发现它只有在我在 shell 中运行整个程序时才有效。除了 shell 之外,还有其他方法可以执行它吗?如果我在没有任何 shell 的情况下运行它或使用 & 将其保持在后台,则 python 启动的进程在 ps -e 表中被命名为 defunct。有人可以帮忙吗?

编辑:

这是我运行的 run.sh:

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

但是并非所有的 subprocess.popen 都会运行失败。例如,如果我使用 festival 程序,它就会运行。但是 xbacklight 不会运行。

这是getcommand.py:

我删除了不必要的部分,这是必要的部分,com 是字符串,我知道这个选择正常进行。:

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

现在谈到对象,类的运作方式如下:

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

当您在没有控制台的情况下运行脚本时,您是在图形会话环境中执行此操作。

创建一个名为testenv.sh以下行的文件:

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

将文件放在与脚本相同的目录中。从图形会话运行它。打开文件,将其保存到其他地方。然后从终端运行该文件并比较输出。

问题很可能出在这里PWD。您依赖在您所在的同一目录中运行的脚本,但所有在图形会话环境中运行的脚本都是使用PWD您主目录中的设置运行的。

也可能是你的脚本缺少舍邦

相关内容