当程序接近最大线程限制时,如何自动重新启动程序?

当程序接近最大线程限制时,如何自动重新启动程序?

我正在使用的第三方工具中似乎存在一个已知的错误,这将导致它“泄漏”线程。如果线程与另一个程序存在某些通信问题,并且这些线程永远不会被清理,那么线程最终将处于僵尸状态。

因为这种情况只发生在发生通信问题时,我不知道线程建立起来需要多长时间,可能会持续几个月而没有任何建立,或者可能会在一小时内一直建立到极限。通信问题的最坏情况。

我无法采取太多措施来防止线程堆积。作为解决方法,我想配置一个程序,以便在线程数接近 ulimit 值时自动重新启动应用程序。我想知道执行此操作的最佳方法是什么?

我可以编写一个每小时运行一次的 cron 作业,检查进程状态并重新启动。有没有更简单的方法,最好是确保在达到 ulimit 后立即重新启动,而不是像 cron 作业方法那样在达到限制后 59 分钟的更糟糕情况?

答案1

您可以使用 crontab 实用程序来完成此操作。

创建一个文件,并将该脚本放入其中。更改您要监控的程序名称。

保存文件,假设您将其命名为 script.sh

#!/bin/sh

MAX_THREADS=60   
PROGRAM_NAME="firefox"
PID=$(ps -A | grep $PROGRAM_NAME | sed 's/\([0-9]*\).*/\1/')
CUR_NO_THREADS=$(cat /proc/"$PID"/status | grep Threads | tr -dc '0-9');

if [ "CUR_NO_THREADS" -ge "$MAX_THREADS" ]; 
then    
     killall $PROGRAM_NAME;
     $PROGRAM_NAME;
fi; 

现在运行 crontab 作为

sudo crontab -e

这将在 vim 或 nano 中打开一个文件,将其放入该文件中

0 * * * * /path/to/script/script.sh

相关内容