我想我使用 cron 作业对我的服务器进行了 fork 轰炸 - 这是发生了什么以及我该如何恢复?

我想我使用 cron 作业对我的服务器进行了 fork 轰炸 - 这是发生了什么以及我该如何恢复?

我安排了一个简单的 Python 脚本在用户下每分钟运行一次foo

SHELL=/bin/bash
BASH_ENV=/home/foo/.bash_profile

* * * * * python /home/foo/slack-bot/main.py 2>&1 /home/foo/slack-bot.log

几分钟后,我收到了这些错误,并很快被踢出了服务器

-bash: fork: Cannot allocate memory
-bash: wait_for: No record of process 32012
-bash: fork: Cannot allocate memory
-bash: wait_for: No record of process 32012
....

哦哦。所以我尝试以 身份登录,root并以 sudo 身份登录foo

sudo -iu foo
sudo: unable to execute /bin/bash: Cannot allocate memory

伟大的。

然后我从用户的 crontab 文件中删除了有问题的行foo,并终止了slack名称中包含的所有进程

kill $(ps aux | grep 'slack' | awk '{print $2}')

我现在收到了不同的错误,但我仍然无法 sudo 该用户:

sudo -iu foo
-bash: xmalloc: .././copy_cmd.c:86: cannot allocate 32 bytes (450560 bytes allocated)

这是怎么回事?我确信我的 cron 计划中存在错误,我会调查,但什么样的行为会导致内存不足的分叉错误?除了硬重置之外,最好的恢复方法是什么?

谢谢!

答案1

这是一种常见的启动模式 - 取决于你的需要......你可能会

  • 增加流程启动之间的时间来增加提前完成的可能性
  • 确定之前的启动是否仍在运行,如果是则终止
  • 创建长时间运行的守护进程,而不是短时间运行的进程
  • 启动 - 执行工作然后终止 - 仅当发现其未运行时,才让观察者进程启动新的启动(a la supervisord)

不知道用例就很难继续

相关内容