在服务器上部署爬虫程序时,我们经常会遇到一个令人头疼的问题:程序运行一段时间后莫名其妙就退出了。这种情况可能由多种原因导致:
传统的解决方案比如nohup和screen虽然简单,但存在明显缺陷:
我曾经用nohup跑过一个电商价格监控爬虫,三天后发现进程早已退出,损失了大量数据。检查日志才发现是内存泄漏导致进程被系统终止,而nohup对此无能为力。
Supervisor作为专业的进程管理工具,提供了全方位的解决方案:
当监控的进程异常退出时,Supervisor会根据配置策略自动重启。支持多种重启策略:
所有标准输出和错误输出都会被重定向到指定日志文件,并支持日志轮转:
ini复制stdout_logfile=/var/log/spider.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10
可以同时管理多个爬虫进程,实现统一控制:
bash复制supervisorctl start all
supervisorctl stop group:spider_*
不同Linux发行版安装方式略有差异:
bash复制sudo apt update
sudo apt install -y supervisor
sudo systemctl enable supervisor
sudo systemctl start supervisor
bash复制sudo yum install -y epel-release
sudo yum install -y supervisor
sudo systemctl enable supervisord
sudo systemctl start supervisord
建议将每个爬虫的配置放在/etc/supervisor/conf.d/目录下,例如spider.conf:
ini复制[program:jd_price_monitor]
command=/usr/bin/python3 /data/spider/jd.py
directory=/data/spider
user=spideruser
autostart=true
autorestart=true
startretries=3
startsecs=5
stopsignal=TERM
stopwaitsecs=10
stdout_logfile=/var/log/jd_spider.log
stderr_logfile=/var/log/jd_spider_err.log
environment=PYTHONPATH="/data/spider",PROXY="http://proxy.example.com:8080"
关键参数说明:
startsecs: 程序持续运行多少秒才认为是启动成功stopsignal: 停止进程时发送的信号类型stopwaitsecs: 发送停止信号后的等待时间environment: 设置进程环境变量对于需要并行运行的爬虫,可以使用numprocs参数:
ini复制[program:image_crawler]
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/python3 /data/spider/image.py
numprocs=4
某些爬虫需要等待其他服务启动后才能运行:
ini复制[program:proxy_checker]
priority=100
command=/usr/bin/python3 /data/spider/proxy.py
[program:main_crawler]
priority=200
command=/usr/bin/python3 /data/spider/main.py
通过eventlistener实现内存监控,防止内存泄漏:
ini复制[eventlistener:memmon]
command=/usr/bin/memmon -p spider=500MB
events=TICK_60
bash复制# 重新加载配置
supervisorctl reread
supervisorctl update
# 进程管理
supervisorctl start spider
supervisorctl stop spider
supervisorctl restart spider
# 状态查看
supervisorctl status
supervisorctl tail spider
使用multitail工具同时监控多个日志:
bash复制multitail -cS log /var/log/spider.log -cS error /var/log/spider_err.log
关键日志分析点:
常见原因及解决方案:
bash复制chmod +x /path/to/spider.py
chown spideruser:spideruser /path/to/logs
bash复制sudo -u spideruser /usr/bin/python3 /path/to/spider.py
bash复制sudo -u spideruser pip install -r requirements.txt
典型场景处理:
防止单个爬虫占用过多资源:
ini复制[program:heavy_spider]
command=/usr/bin/python3 heavy.py
process_prio=100
minfds=1024
minprocs=200
与Prometheus集成监控:
ini复制[inet_http_server]
port=127.0.0.1:9001
使用supervisor_exporter暴露指标:
bash复制docker run -d -p 9101:9101 -v /var/run/supervisor.sock:/var/run/supervisor.sock lysender/supervisor-exporter
ini复制user=spideruser
ini复制[unix_http_server]
file=/var/run/supervisor.sock
chmod=0700
ini复制[supervisord]
username=admin
password=securepassword
在实际生产环境中,我通常会为每个爬虫创建单独的系统用户,并配置严格的权限控制。同时会设置日志轮转策略,避免日志文件占用过多磁盘空间。