如何定期终止并重新启动 python 脚本?描述中包含示例 python 脚本

How do I kill and restart a python script at regular intervals? Example python script included in description

示例如下:

from concurrent.futures import ProcessPoolExecutor
import time


elapsed = 0
start_time = time.time()
func_args = [i for i in range(100)]


def func(x):
    return x*x


if __name__ == '__main__':
    while elapsed < 600:
        with ProcessPoolExecutor() as executor:
            for item in executor.map(
                            func,
                            func_args
                            ):
                print(item)
        elapsed = time.time() - start_time

如何以 5 分钟的固定间隔终止并重新启动此脚本?我认为使用 shell 是可能的,但不确定在使用此脚本中的并行进程时它如何工作。

如果您好奇我为什么要每 5 分钟终止并重新启动此脚本:在我的 actual/production 代码中,func() 是一个会泄漏内存的函数。它需要大约 30 分钟才能引起任何严重问题,我想在此之前终止并重新启动整个脚本。我也在尝试解决内存泄漏问题,所以这是一个临时解决方案。

您可以通过 crontab 完成此操作(另请参阅 man crontab)。该脚本将是一个简单的 bash 脚本,例如以下:

#!/bin/bash

# kill running script
ps ax | grep bot.py | grep -v grep | awk '{print }' | xargs kill -9

# restart
/path/to/your_script.py & disown

crontab 条目(使用 crontab -e 编辑)应该如下所示:

*/5 * * * * /path/to/bash_script.sh

一个更简单的解决方案但是恕我直言,只需在内存上使用 ulimit 设置硬资源限制(请参阅 bash shell 中的 help ulimit)可以被进程使用,这样只要超过限制就会被杀掉。然后,只需使用 bash 脚本在循环中调用脚本:

#!/bin/bash

# limit virtual memory to 500MB
ulimit -Sv 500000 -Hv 500000

while true; do
    /path/to/your_script.py
    sleep 1
done