求助:Monit重启Python程序时无法识别已安装的psutil库
Monit重启Python程序时找不到已安装库的解决方法
问题背景
在WSL环境下用sudo运行Monit监控Python程序,手动在终端能正常启动程序,但Monit重启时提示找不到已安装的psutil库,相关日志与配置如下:
Monit错误日志
[2023-02-07T11:33:11-0800] error : 'PythonCrashTest' failed to restart (exit status 1) -- '/mnt/c/Users/ARSialer/Desktop/monitTest/main.py start': Traceback (most recent call last): File "/mnt/c/Users/ARSialer/Desktop/monitTest/main.py", line 4, in <module> import psutil ModuleNotFoundError: No module named 'psutil'
Monit配置(monitrc)
check process PythonCrashTest with pidfile /mnt/c/Users/ARSialer/Desktop/monitTest/test.pid start = "/mnt/c/Users/ARSialer/Desktop/monitTest/main.py" with timeout 3 seconds restart = "/mnt/c/Users/ARSialer/Desktop/monitTest/main.py" with timeout 3 seconds
Python脚本shebang
#!/usr/bin/env python3
问题原因
sudo运行Monit时使用的是root用户的环境变量,和普通用户的Python环境不一致:你在普通终端安装的psutil属于用户级Python环境,而root用户的Python环境无法识别;另外#!/usr/bin/env python3在sudo环境下可能指向系统级Python,而非你日常使用的用户级Python。
解决方案
1. 使用Python解释器的绝对路径(推荐)
先在普通用户终端执行命令,找到你常用的Python3路径:
which python3输出示例:
/home/your_username/.local/bin/python3(替换为你的实际路径)方案A:修改Python脚本的shebang
将脚本开头的#!/usr/bin/env python3替换为刚才得到的绝对路径:#!/home/your_username/.local/bin/python3保存后确保脚本有执行权限:
chmod +x /mnt/c/Users/ARSialer/Desktop/monitTest/main.py方案B:修改Monit的启动命令
在monitrc里直接用绝对路径的Python运行脚本:check process PythonCrashTest with pidfile /mnt/c/Users/ARSialer/Desktop/monitTest/test.pid start = "/home/your_username/.local/bin/python3 /mnt/c/Users/ARSialer/Desktop/monitTest/main.py" with timeout 3 seconds restart = "/home/your_username/.local/bin/python3 /mnt/c/Users/ARSialer/Desktop/monitTest/main.py" with timeout 3 seconds验证:用sudo执行该绝对路径的Python,测试是否能导入psutil:
sudo /home/your_username/.local/bin/python3 -c "import psutil; print('success')"输出
success则说明配置有效。
2. 将库安装到root用户的Python环境
直接用sudo安装psutil,让root环境能识别该库:
sudo pip3 install psutil
这种方法操作简单,但如果程序依赖多个用户级库,需要逐个安装到系统/root环境。
3. 让sudo保留普通用户的环境变量
修改Monit的启动命令,用sudo -E保留当前用户的环境(需确保sudoers配置允许):
check process PythonCrashTest with pidfile /mnt/c/Users/ARSialer/Desktop/monitTest/test.pid start = "sudo -E /mnt/c/Users/ARSialer/Desktop/monitTest/main.py" with timeout 3 seconds restart = "sudo -E /mnt/c/Users/ARSialer/Desktop/monitTest/main.py" with timeout 3 seconds
注意:这种方法可能存在安全风险,需谨慎使用。
内容的提问来源于stack exchange,提问作者Alonso Rios
相关产品推荐
相关产品推荐

