我有一个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
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
让它在第一个错误处停止。
尽管在这个主题上有两个“偏离主题”的“关闭”投票,但为什么在systemd下工作方式不同的是这个Stack Exchange站点的主题。