Systemd服务中Node.js调用Python-Shell无执行的问题求助
我之前碰到过好几个类似的systemd服务踩坑案例,核心问题都是手动运行和systemd服务的运行环境不一样,给你几个具体的排查和解决方向:
1. 检查工作目录是否正确
手动运行脚本时,你是在脚本所在的文件夹执行的,但systemd默认的工作目录是根目录/。如果你的device-example.js里用相对路径调用Python脚本(比如python-shell.run('led.py')),那systemd会在/下找这个脚本,自然找不到,导致静默失败。
解决方法:
- 要么在
iot.service配置文件里指定工作目录:[Service] # 替换成你的脚本实际所在路径 WorkingDirectory=/home/your-user/alexa-led-project - 要么在
device-example.js里用绝对路径调用Python脚本:// 替换成led.py的绝对路径 python-shell.run('/home/your-user/alexa-led-project/led.py');
2. 验证运行用户的权限
手动运行时用的是你的普通用户,但systemd默认可能用root或者nobody这类受限用户运行服务。如果你的Python脚本需要访问Dragonboard的GPIO引脚(控制LED必然需要),权限不足的话会直接失败,而且不会有明显报错。
解决方法:
- 先把你的普通用户加入
gpio组,获得GPIO访问权限:sudo usermod -aG gpio your-user - 然后在
iot.service里指定用这个用户运行服务:[Service] User=your-user Group=your-user
3. 检查环境变量(尤其是PATH)
systemd服务的环境变量和终端里的完全不一样,比如你的终端里PATH包含了Python的路径,但systemd的默认PATH可能只有/usr/bin:/bin,如果你的Python安装在/usr/local/bin或者其他位置,会导致找不到Python解释器。
解决方法:
- 要么在
device-example.js里用Python的绝对路径调用:// 先通过`which python3`找到你的Python路径 python-shell.run('/usr/bin/python3 /home/your-user/alexa-led-project/led.py'); - 要么在
iot.service里手动设置PATH环境变量:[Service] Environment=PATH=/usr/local/bin:/usr/bin:/bin
4. 查看完整的systemd日志
你说“无报错信息”,但大概率是错误输出被systemd捕获到journal日志里了,只是你没看到。用下面的命令实时查看iot.service的日志:
journalctl -u iot.service -f
或者查看最近10分钟的日志:
journalctl -u iot.service --since "10 minutes ago"
日志里可能会有Python脚本的错误信息(比如找不到模块、权限不足等),这是排查问题的关键。
5. 单独测试Python脚本的systemd运行环境
为了排除是node.js或python-shell的问题,你可以写一个简单的测试service,直接运行你的Python脚本:
# /etc/systemd/system/test-led.service [Unit] Description=Test LED Python Script [Service] User=your-user WorkingDirectory=/home/your-user/alexa-led-project ExecStart=/usr/bin/python3 led.py StandardOutput=journal+console StandardError=journal+console [Install] WantedBy=multi-user.target
然后重新加载systemd配置并启动测试服务:
sudo systemctl daemon-reload sudo systemctl start test-led.service
再用journalctl -u test-led.service -f查看日志,如果这个测试服务也无法运行LED,那问题就出在Python脚本或systemd环境上,和node.js无关;如果能运行,再排查python-shell的调用逻辑。
6. 确保Python脚本的可执行权限
虽然用python3调用脚本不需要可执行权限,但还是检查一下:
chmod +x /home/your-user/alexa-led-project/led.py
同时确保脚本开头的shebang是正确的(如果需要的话):
#!/usr/bin/env python3
内容的提问来源于stack exchange,提问作者cbolles

