为什么从Debian服务启动shell脚本不像命令行一样工作?

时间:2019-11-03 13:26:58

标签: bash debian systemd

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

要跳过此步骤,我添加了一个管道,将登录信息直接插入命令中,如下所示:

printf "login" | python_module-py

现在,我想安排机器人的启动,而不必自己启动,并避免机器人始终需要我的电脑。

因此,我购买了Debian VPS并尝试创建systemd服务。我将命令放在外壳中。这是我的服务:(假设我的脚本在/ 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'

2 个答案:

答案 0 :(得分:0)

该管道将无法直接在例如ExecStart语句,相反,您应该使用类似ExecStart=/bin/sh -c 'printf "login" | python_module-py'的方式让/bin/sh处理管道。

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

答案 1 :(得分:0)

我解决了这个问题。

就我而言,我必须使用xargs命令来确保确实粘贴了管道中的文本。

printf "login" | xargs python_module-py