当我把它放在 /etc/network/if-up.d/ 中时,Python 脚本会运行多次?



我做了一个python脚本,它使用SMTP服务器将邮件发送到给定的id。我希望脚本每次连接到互联网时都能运行,所以我把myfile(比如 python.py(放在位置"/etc/network/if-up.d/",里面没有扩展名,并通过"sudo chmod +x/etc/network/if-up.d/python"命令使其可执行。一切正常,即我的脚本在我连接到互联网时运行,但后来我注意到发送邮件的电子邮件 ID 收到了多封邮件(主要是两次(,这意味着脚本运行了几次。为什么会这样?保存在"if-up.d/"中的脚本是否运行多次或与我的网络相关。(注意:我的网络(usb-tethered(在此过程中没有断开连接,我使用类似的脚本在启动后使用crontab运行,它运行良好。我正在乌博托工作 16.04(

这是一个老问题,但我遇到了类似的问题。我的帖子可以在这里查看,但if-up.d/不保证脚本只会运行一次。它的作用是获取脚本并基于每个接口执行它(一个执行用于eth0,一个执行用于wlan0,一个执行用于lo等(。如果脚本只运行一次,则获得所需效果的两个选项是:

我在脚本级别的初始方法是
如果您正在运行连续的东西,您可以检查以确保只有一个脚本实例正在运行。我正在为我们的 IRC 服务器运行一个 python 机器人,因此连接了两次,我写了这个来解决它

def check_running():
get_processes = 'ps aux'.split()             # grab list of running processes
get_bots      = 'grep bot.py$ -c'.split()    # search for your script, note the '$' for an end of line match and '-c' for a numeric count of occurrences
out1          = subprocess.Popen(get_processes, stdout=subprocess.PIPE)
out2          = int(subprocess.check_output(get_bots, stdin=out1.stdout).rstrip())
return        out2

if check_running() != 1: # the count should be one since the script is looking for itself
sys.exit(0)
# continue with the script after performing initial check

准确的方法
我将对 python 的调用包装在一个 sh 脚本中,而 sh 脚本是存储在if-up.d/中的内容。对于这种方法,我需要做的就是在执行调用之前更新我的脚本以验证我想使用的接口。

[ "$IFACE" = 'eth0' ] || exit 0 # interface accessing script must match, or exit
sleep 269 
sh -c "python /dir/to/bot.py >> /dir/to/log" & disown

最新更新