要让python脚本在后台持续执行,可使用 nohup 与 & 结合实现简单后台运行,适合临时任务;2. 使用 screen 或 tmux 创建可分离会话,便于交互式管理长期任务;3. 使用 supervisor 实现进程监控、自动重启和集中管理,适合多脚本或生产环境;4. 配置 systemd 服务实现最可靠的后台运行和开机自启,是linux生产环境首选;5. 为确保服务器重启后脚本自动运行,应采用 systemd 或 supervisor 等系统级管理工具;6. 日志处理应结合输出重定向与python logging 模块,实现结构化日志记录;7. 错误监控需结合进程管理工具状态检查、邮件通知或集成sentry等专业服务,实现主动告警;8. linux系统推荐使用 systemd、nohup、screen 等工具,注意路径、权限和环境变量问题;9. windows系统可通过任务计划程序、pythonw.exe 或封装为windows服务实现后台运行,需注意权限和路径分隔符;10. 跨平台通用建议包括使用虚拟环境、完善错误处理、配置日志轮转、管理资源占用并实现优雅退出,以确保脚本稳定可靠运行。

运行Python脚本并让它在后台持续执行,这事儿说起来简单,但真要做到稳定、可靠,背后可有不少门道。核心思路无非是让脚本脱离当前终端会话的控制,即使你关掉终端,它也能自顾自地跑下去。这通常涉及进程管理、输出重定向以及系统服务的配置,具体用哪种方法,还得看你的需求强度和运行环境。
要让Python脚本在后台持续执行,有几种常见且实用的方法,每种都有其适用场景:
使用 nohup
&
nohup
&
立即学习“Python免费学习笔记(深入)”;
nohup python your_script.py > output.log 2>&1 &
这里,
> output.log
2>&1
output.log
使用 screen
tmux
screen
screen -S my_session
my_session
python your_script.py
Ctrl+A D
screen -r my_session
tmux
tmux new -s my_session
python your_script.py
Ctrl+B D
tmux attach -t my_session
使用进程管理工具(如 Supervisor
Supervisor
Supervisor
pip install supervisor
.conf
Supervisor
创建系统服务(如 systemd
systemd
systemctl
让Python脚本在服务器重启后依然坚挺地跑起来,这可不是简单地
nohup
systemd
Supervisor
systemd
systemd
编写 .service
.service
/etc/systemd/system/
my_script.py
my_script.service
[Unit] Description=My Python Background Script After=network.target # 确保网络服务启动后再启动你的脚本 [Service] User=your_username # 运行脚本的用户,建议非root Group=your_group # 运行脚本的用户组 WorkingDirectory=/path/to/your/script/directory # 脚本的工作目录 ExecStart=/usr/bin/python3 /path/to/your/script/my_script.py # 你的Python解释器路径和脚本路径 Restart=on-failure # 脚本崩溃时自动重启 StandardOutput=append:/var/log/my_script.log # 标准输出重定向到日志文件 StandardError=append:/var/log/my_script_error.log # 标准错误重定向到另一个日志文件 [Install] WantedBy=multi-user.target # 在多用户模式下启动
这里有几个小坑:
ExecStart
/usr/bin/python3
python3
ExecStart
/path/to/your/venv/bin/python
刷新和启用服务: 保存文件后,需要让
systemd
sudo systemctl daemon-reload # 重新加载所有服务单元文件 sudo systemctl enable my_script.service # 设置开机自启 sudo systemctl start my_script.service # 立即启动服务
之后,你可以用
sudo systemctl status my_script.service
Supervisor
Supervisor
systemd
Supervisor
安装 Supervisor
pip install supervisor
或者通过系统包管理器安装。
生成并配置 supervisord.conf
echo_supervisord_conf > /etc/supervisord.conf
然后编辑这个配置文件,在末尾添加你的程序配置:
[program:my_python_script] command=/usr/bin/python3 /path/to/your/script/my_script.py # 你的脚本命令 directory=/path/to/your/script/directory # 脚本的工作目录 autostart=true # Supervisor启动时自动启动 autorestart=true # 脚本退出时自动重启 startsecs=5 # 启动后5秒内不退出才算成功启动 user=your_username # 运行用户 stdout_logfile=/var/log/supervisor/my_script.log # 标准输出日志 stderr_logfile=/var/log/supervisor/my_script_error.log # 标准错误日志
别忘了在
supervisord.conf
[include]
启动 Supervisor
supervisord -c /etc/supervisord.conf # 启动Supervisor服务 supervisorctl reread # 重新读取配置 supervisorctl update # 更新配置 supervisorctl start my_python_script # 启动你的脚本
为了让
Supervisor
supervisord
systemd
选择
systemd
Supervisor
systemd
Supervisor
后台运行脚本,最怕的就是它悄无声息地挂掉,或者虽然在跑,但出了问题你却一无所知。所以,日志输出和错误监控是后台脚本的生命线,少了它们,你就是在盲人摸象。
1. 日志输出:重定向与Python内置 logging
最基础的日志处理,就是把脚本的标准输出和标准错误重定向到文件。这是
nohup
systemd
# nohup 示例 nohup python your_script.py > script_output.log 2>&1 &
或者在
systemd
StandardOutput=append:/var/log/my_script.log StandardError=append:/var/log/my_script_error.log
这样做的好处是简单粗暴,所有
print()
然而,对于任何稍微复杂一点的Python脚本,我强烈建议使用Python内置的
logging
一个简单的
logging
import logging
import os
# 定义日志文件路径
log_dir = '/var/log/my_python_app' # 建议将日志放在专门的目录
os.makedirs(log_dir, exist_ok=True)
log_file_path = os.path.join(log_dir, 'app.log')
# 配置日志
logging.basicConfig(
level=logging.INFO, # 设置最低记录级别
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler(log_file_path), # 输出到文件
logging.StreamHandler() # 同时输出到控制台 (如果脚本在前台运行)
]
)
logger = logging.getLogger(__name__)
def run_task():
try:
logger.info("任务开始执行...")
# 模拟一些操作
result = 10 / 0 # 故意制造一个错误
logger.info(f"任务完成,结果: {result}")
except Exception as e:
logger.error(f"任务执行失败: {e}", exc_info=True) # exc_info=True 会记录完整的堆栈信息
if __name__ == "__main__":
run_task()这样,你的脚本日志会更加结构化,排查问题也方便得多。
2. 错误监控:不仅仅是日志
日志是事后诸葛亮,错误监控则是实时预警。仅仅把错误写入日志文件是不够的,你还需要知道它们何时发生。
进程管理工具的内置功能:
Supervisor
systemd
systemctl status your_service
supervisorctl status
邮件/短信通知: 对于关键的错误,可以考虑在Python脚本内部集成邮件或短信通知功能。当捕获到严重异常时,立即发送警报。有许多第三方库可以简化这一过程,例如
smtplib
专门的错误监控服务: 对于生产环境,使用Sentry、Rollbar、Bugsnag这类专业的错误监控服务是更优的选择。它们能实时捕获脚本中的异常,聚合错误信息,提供堆栈跟踪,并能集成到你的通知系统(Slack、钉钉等)。你只需要在Python代码中集成它们的SDK。
# Sentry 示例 (需要安装 sentry-sdk)
import sentry_sdk
from sentry_sdk import capture_exception
sentry_sdk.init(
dsn="YOUR_SENTRY_DSN",
traces_sample_rate=1.0 # 采样率
)
try:
# 你的代码
result = 10 / 0
except Exception as e:
capture_exception(e) # 捕获异常并发送到Sentry定时检查脚本状态: 你可以设置一个
cron
总而言之,日志是基础,提供详细的运行记录;错误监控是预警系统,确保你能在问题发生时第一时间知晓。两者结合,才能让你对后台运行的Python脚本有足够的掌控力。
后台运行Python脚本这事儿,虽然核心理念都一样,但具体到不同操作系统,操作方式和一些细节确实有挺大的差异。这就像做菜,主料不变,但南北方做法和调料可能就大相径庭了。
1. Linux/Unix-like 系统 (包括 macOS)
这是Python脚本后台运行的“主场”,工具链非常成熟和丰富。
nohup
&
screen
tmux
systemd
cron
cron
>
2>&1
disown
&
nohup
disown
python your_script.py > output.log 2>&1 & disown
注意事项:
systemd
cron
venv
conda
/path/to/venv/bin/python
/dev/null
nohup.out
2. Windows 系统
Windows在后台运行脚本方面,虽然不如Linux那么“原生”,但也有其独特的方法。
cron
systemd
python.exe
pythonw.exe
pythonw.exe
pythonw your_script.py
start
start
min
b
start /b python your_script.py > output.log 2>&1
但这个命令在当前CMD窗口关闭后,进程可能会被终止,不如
任务计划程序
pywin32
注意事项:
\
/
跨平台共性与通用建议:
try-except
logging
SIGTERM
总的来说,选择哪种方法,很大程度上取决于你的需求:是临时的快速启动,还是生产环境的长期稳定运行?是个人开发,还是团队协作?理解这些差异,能帮助你做出更明智的选择,避免不必要的麻烦。
以上就是运行Python脚本怎样在后台持续执行 运行Python脚本的后台运行设置技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号