如何在Ubuntu Server中配置Python应用自启动并赋予其sudo权限
最优方案:systemd系统服务配置
Ubuntu Server默认自带systemd进程管理工具,无需额外安装,配置极简、稳定性高,完美满足开机自启、权限控制、进程守护需求,完全支持Python的subprocess.Popen()调用系统命令。
前置准备
- 确认Python应用的绝对路径,比如
/opt/myapp/main.py,同时通过which python3获取Python解释器的绝对路径(默认一般为/usr/bin/python3) - 先手动运行应用测试功能正常,
Popen()相关逻辑无报错
具体落地步骤
1. 编写systemd服务配置文件
在/etc/systemd/system/目录下新建服务文件,比如命名为myapp.service,内容参考如下:
[Unit] Description=自定义Python应用服务 After=network.target # 若应用需要联网,添加该配置确保网络启动后再运行应用 [Service] Type=simple User=root # 直接用root运行,天然具备最高权限,Popen调用任何命令都不需要额外输入sudo密码 Restart=on-failure # 可选配置,应用崩溃后自动重启 WorkingDirectory=/opt/myapp/ # 替换为你的应用根目录的绝对路径 ExecStart=/usr/bin/python3 /opt/myapp/main.py # 替换为你的Python解释器绝对路径+应用入口文件绝对路径 Environment=PYTHONUNBUFFERED=1 # 可选配置,让Python日志直接输出到systemd日志,方便排查问题 [Install] WantedBy=multi-user.target
如果你不想用root运行应用,只想给应用开放特定命令的sudo权限,把
User参数改成你指定的普通用户,再执行下一步的sudoers配置即可。
2. (可选)非root运行时配置sudo免密权限
如果用普通用户运行服务,需要让该用户执行Popen调用的命令时无需输入密码,操作如下:
执行visudo命令编辑sudoers文件,在末尾添加一行:
你的用户名 ALL=(ALL) NOPASSWD: /usr/bin/xxx, /usr/bin/yyy
把你的用户名替换为实际的运行用户,/usr/bin/xxx替换为Popen里要调用的命令的绝对路径,多个命令用英文逗号分隔。
3. 加载配置并启用服务
依次执行以下命令:
- 重新加载systemd配置:
sudo systemctl daemon-reload - 启用开机自启:
sudo systemctl enable myapp.service - 立即启动服务:
sudo systemctl start myapp.service
验证配置
- 查看服务运行状态:
sudo systemctl status myapp.service,显示active (running)即为正常运行 - 查看应用日志:
journalctl -u myapp.service -f,可实时查看应用输出,确认Popen调用是否正常 - 重启服务器验证:执行
sudo reboot,重启后再次查看服务状态,确认可自动启动
注意事项
- 所有路径必须使用绝对路径,不要用相对路径,避免systemd找不到文件
- 如果Python应用使用了虚拟环境,
ExecStart里的Python解释器要替换为虚拟环境内的绝对路径,比如/opt/myapp/venv/bin/python3 - 如果
Popen调用的是自定义脚本,要确保脚本具备可执行权限,路径配置正确
内容的提问来源于stack exchange,提问作者Isaiah
相关产品推荐
相关产品推荐

