我有一个python脚本,可以作为服务自动启动(通过systemd激活)。在此python脚本中,我使用subprocess.call(script_file,shell=True)
调用了bash脚本。
当我手动调用python脚本($ python my_python_script.py
)时,一切正常。但是,自动启动的程序不会执行bash脚本(无论如何运行,我都检查了一下,使其编辑了文本文件,实际上确实如此)。
我(认为)我授予了所有人对bash脚本的读写权限。有人对我在做什么错有想法吗?
附录:我想编写一个小脚本,通过电报向我发送我的公共IP地址。服务文件如下所示:
[Unit]
Description=IPsender
After=networking.service
[Service]
Type=simple
User=root
WorkingDirectory=/home/pi/projects/tg_bot
ExecStart=/home/pi/miniconda3/bin/python /home/pi/projects/tg_bot/ip_sender_tg.py
Restart=always
[Install]
WantedBy=multi-user.target
答案 0 :(得分:1)
Protawn,欢迎使用Unix和Linux StackExchange。
为什么脚本在系统下的工作方式不同是一个常见的问题。在该网站的其他地方查看this answer的常见问题。
没有Python和Bash脚本的源代码,很难猜测您遇到了什么区别。
我个人的猜测是,您的bash
脚本正在调用其他没有完整路径的二进制文件,而这些路径是在您的shell $PATH
中找到的,而不是默认的systemd path
。
将set -x
添加到bash脚本的顶部,以便所有操作均被记录为标准输出,并将记录在systemd
日志中。然后,在失败后,使用journalctl -u your-service-name
查看服务日志,以查看是否可以找到bash成功执行的最后一条命令。还可以考虑在bash脚本中使用set -e
,以使其在第一个错误时停止。
尽管在此主题上有两次“脱位”“关闭”表决,但在此Stack Exchange站点的主题中,为何在systemd下工作却不同。