【问题标题】:Why launching a shell script from Debian service does not behave as command line?为什么从 Debian 服务启动 shell 脚本不像命令行?
【发布时间】:2019-11-03 13:26:58
【问题描述】:

我有一个 python 机器人,我在命令行中启动并要求我登录才能开始工作。

为了跳过这一步,我添加了一个管道来直接在命令中插入登录名,如下所示:

printf "login" | python_module-py

现在,我想安排机器人的启动,这样就不必自己启动它,并避免机器人需要我的计算机始终打开。

所以我买了一个 Debian VPS 并尝试创建一个 systemd 服务。我把命令放在一个shell中。这是我的服务:(假设我的脚本在 /home/user 并且我拥有所有权限 rwx)

[Unit]
Description=Description
After=network.target

[Service]
Type=simple
User=user
Group=group
WorkingDirectory=/home/user
ExecStart=./script.sh

[Install]
WantedBy=multi-user.target

我尝试启动它,但由于此错误而失败:

TypeError: unsupported operand type(s) for /: 'NoneType' and 'int'

我几乎可以肯定那是因为登录没有通过管道传递,我想知道为什么。

请原谅我的英语问题。

[也经过测试]

使用/bin/sh -c 将命令保留在服务中也会给出相同的错误:

ExecStart=/bin/sh -c '/usr/bin/printf "login" | /usr/bin/python3.7 -m python_module'

【问题讨论】:

    标签: bash debian systemd


    【解决方案1】:

    管道不能直接在例如管道中工作。 ExecStart 声明,你应该使用类似ExecStart=/bin/sh -c 'printf "login" | python_module-py' 的东西让/bin/sh 处理管道。

    您还应该能够通过设置StandardInput 将文件作为标准输入传递给您的服务。

    【讨论】:

    • 嗨塞巴斯蒂安,感谢您的回复和您的时间。我编辑了我的问题以提供更多信息。我已经在 SO 帖子中看到服务不是完整的 shell,所以我们必须使用 /bin/sh/ -c。所以我将我的 ExecStart 编辑为:/bin/sh -c '/usr/bin/printf "login" | /usr/bin/python3.7 -m python_module
    【解决方案2】:

    我解决了这个问题。

    在我的例子中,我必须使用 xargs 命令来确保粘贴在管道中的文本是真正粘贴的。

    printf "login" | xargs python_module-py
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-18
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      相关资源
      最近更新 更多