更多>>关于我们
西安鲲之鹏网络信息技术有限公司从2010年开始专注于Web(网站)数据抓取领域。致力于为广大中国客户提供准确、快捷的数据采集相关服务。我们采用分布式系统架构,日采集网页数千万。我们拥有海量稳定高匿HTTP代理IP地址池,可以有效获取互联网任何公开可见信息。
您只需告诉我们您想抓取的网站是什么,您感兴趣的字段有哪些,你需要的数据是哪种格式,我们将为您做所有的工作,最后把数据(或程序)交付给你。
数据的格式可以是CSV、JSON、XML、ACCESS、SQLITE、MSSQL、MYSQL等等。
更多>>技术文章
发布时间:2020-02-15 来源:西安鲲之鹏官微
【经验分享】“supervisor实现无限重试”中的坑
背景:Debian 10系统,Wifi联网,需要实现系统启动时自动启动autossh。
问题:如果网络未连接成功(例如,Wifi是在用户登录之后才会连接),启动autossh会失败退出。因此不能直接使用rc.local(在网络连接成功之前就执行了)。于是想到使用supervisor,让其不断的重试,当网络连接正常时就autossh就会正常被启动了,配置如附图1所示。但是发现supervisor最多只重试了3次就放弃了。
查询supervisor configuration文档(http://supervisord.org/configuration.html?highlight=startretries)得知startretries参数用于控制每次启动的重试次数,默认值是3。
另外还有一个autorestart参数,如果设置为true,则无条件重启(If true, the process will be unconditionally restarted when it exits, without regard to its exit code.)。但我设置了autorestart为true后,还是只重试了3次。
为什么呢?在autorestart参数注意事项里看到了如下说明:
autorestart controls whether supervisord will autorestart a program if it exits after it has successfully started up (the process is in the RUNNING state).
意思就是说目标program必须成功启动过一次(被标记过为RUNNING状态),autorestart机制才会起作用。
由于本案例中supervisor服务启动的时候网络连接还没建立成功,所以目标program(autossh)首次启动(3次重试)会失败,这样autorestart机制就没起作用。
怎么破?
首先我们要弄清楚supervisor是怎么判断目标程序成功启动了呢。
在startsecs参数的说明里我们可以看到:
The total number of seconds which the program needs to stay running after a startup to consider the start successful (moving the process from the STARTING state to the RUNNING state).
也就是只有目标程序启动保持运行超过startsecs秒才会被认为启动成功了(标记状态为RUNNING)。startsecs默认值是1。本例中autossh由于没有网络连接闪退了,所以supervisor认为其启动失败。
弄清原理之后,就好办了,我们实现一个这样的脚本:
(1)先判断网络连接是否正常(可以使用ping),如果不正常则等待10秒(只要超过startsecs值即可)后退出。
(2)如果网络连接正常,则启动autossh。
#!/bin/bash
# 检测网络是否通畅
ping -c 1 www.baidu.com
if [ $? -eq 0 ]
then
# 网络正常,启动autossh
echo "Network is ready"
sudo /bin/su qi -l -c "/usr/bin/autossh -M 6777 -N -D 127.0.0.1:1080 目标主机SSH参数"
else
# 网络不通,等待11秒后退出
echo "Network is not ready."
sleep 11s
exit 1
fi
实测成功。
附Supervisor Configuration File文档链接:http://supervisord.org/configuration.html
背景:Debian 10系统,Wifi联网,需要实现系统启动时自动启动autossh。
问题:如果网络未连接成功(例如,Wifi是在用户登录之后才会连接),启动autossh会失败退出。因此不能直接使用rc.local(在网络连接成功之前就执行了)。于是想到使用supervisor,让其不断的重试,当网络连接正常时就autossh就会正常被启动了,配置如附图1所示。但是发现supervisor最多只重试了3次就放弃了。
查询supervisor configuration文档(http://supervisord.org/configuration.html?highlight=startretries)得知startretries参数用于控制每次启动的重试次数,默认值是3。
另外还有一个autorestart参数,如果设置为true,则无条件重启(If true, the process will be unconditionally restarted when it exits, without regard to its exit code.)。但我设置了autorestart为true后,还是只重试了3次。
为什么呢?在autorestart参数注意事项里看到了如下说明:
autorestart controls whether supervisord will autorestart a program if it exits after it has successfully started up (the process is in the RUNNING state).
意思就是说目标program必须成功启动过一次(被标记过为RUNNING状态),autorestart机制才会起作用。
由于本案例中supervisor服务启动的时候网络连接还没建立成功,所以目标program(autossh)首次启动(3次重试)会失败,这样autorestart机制就没起作用。
怎么破?
首先我们要弄清楚supervisor是怎么判断目标程序成功启动了呢。
在startsecs参数的说明里我们可以看到:
The total number of seconds which the program needs to stay running after a startup to consider the start successful (moving the process from the STARTING state to the RUNNING state).
也就是只有目标程序启动保持运行超过startsecs秒才会被认为启动成功了(标记状态为RUNNING)。startsecs默认值是1。本例中autossh由于没有网络连接闪退了,所以supervisor认为其启动失败。
弄清原理之后,就好办了,我们实现一个这样的脚本:
(1)先判断网络连接是否正常(可以使用ping),如果不正常则等待10秒(只要超过startsecs值即可)后退出。
(2)如果网络连接正常,则启动autossh。
#!/bin/bash
# 检测网络是否通畅
ping -c 1 www.baidu.com
if [ $? -eq 0 ]
then
# 网络正常,启动autossh
echo "Network is ready"
sudo /bin/su qi -l -c "/usr/bin/autossh -M 6777 -N -D 127.0.0.1:1080 目标主机SSH参数"
else
# 网络不通,等待11秒后退出
echo "Network is not ready."
sleep 11s
exit 1
fi
实测成功。
附Supervisor Configuration File文档链接:http://supervisord.org/configuration.html
特别说明:该文章为鲲鹏数据原创内容 ,您除了可以发表评论外,还可以转载到别的网站,但是请保留源地址,谢谢!!(尊重他人劳动,我们共同努力)
☹ Disqus被Qiang了,之前的评论内容都没了。如果您有爬虫相关技术方面的问题,欢迎发到我们的问答平台:http://spider.site-digger.com/