如何定期终止并重新启动 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
示例如下:
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