![当程序接近最大线程限制时,如何自动重新启动程序?](https://linux22.com/image/10231/%E5%BD%93%E7%A8%8B%E5%BA%8F%E6%8E%A5%E8%BF%91%E6%9C%80%E5%A4%A7%E7%BA%BF%E7%A8%8B%E9%99%90%E5%88%B6%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E8%87%AA%E5%8A%A8%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8%E7%A8%8B%E5%BA%8F%EF%BC%9F.png)
我正在使用的第三方工具中似乎存在一个已知的错误,这将导致它“泄漏”线程。如果线程与另一个程序存在某些通信问题,并且这些线程永远不会被清理,那么线程最终将处于僵尸状态。
因为这种情况只发生在发生通信问题时,我不知道线程建立起来需要多长时间,可能会持续几个月而没有任何建立,或者可能会在一小时内一直建立到极限。通信问题的最坏情况。
我无法采取太多措施来防止线程堆积。作为解决方法,我想配置一个程序,以便在线程数接近 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