Ubuntu 20 上的 Cron 作业直到机器重启才会停止

Ubuntu 20 上的 Cron 作业直到机器重启才会停止

我的 crontab 中有这个 cron 任务

* * * * * while true; do curl https://example.com/Payments/cron_jobs_with_codeigniter --silent --compressed; sleep 5; done

它可以工作,但是当我清空 crontab 并保存,然后重新启动 cron 时

sudo service cron restart

上面的 cron 作业仍在运行。当我ps aux命令仍在运行时,但每次都使用不同的 PID,因此我无法终止所有命令,因为每 5 秒就会有一个新的 PID。

我怎样才能在不重新启动整个机器的情况下停止恶意的 cron 作业?

答案1

我发现了一些我永远不会在 cron 中做的事情。

  1. 没时间 (* * * * *)
  2. 一会儿。

请不要这样做:您正在对您的系统进行 dos'ing 操作。

我怎样才能在不重新启动整个机器的情况下停止恶意的 cron 作业?

不要這樣做嗎?

编写一个脚本并调用该脚本。在脚本中插入一个检查,以便每次只运行一次该脚本(这样您就不会让它同时运行多次),并将您的 while 语句放入脚本中。

然后使用计时器(如“@reboot”)或时间启动脚本。这样,您的脚本就有 1 个可以终止的 PID,但我建议添加类似 pid 文件的内容,您可以读取此文件并让您的脚本优雅地停止(并且仅在 pid 文件指示它应该启动时才启动)(包含“active”或“stop”的文件,让脚本继续或自行停止;cron 重新启动它并检查文件)。

不使用脚本,而是使用 systemd 单元(完全不需要 cron)也可以达到同样的效果。这样,您就可以使用 systemd 的启动/停止/重启选项来操作您的单元。

答案2

我编写了这个监控脚本来处理计划的运行

我开始创建文件

sudo nano /etc/supervisor/conf.d/cron_jobs_with_codeigniter.conf
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl
supervisor > start cron_jobs_with_codeigniter
supervisor > status
supervisor > quit

然后写了这个

[program:cron_jobs_with_codeigniter]
process_name=%(program_name)s_%(process_num)02d
numprocs=2
command= curl https://example.com/Payments/cron_jobs_with_codeigniter
autostart=true
autorestart=true
startsecs=0
startretries=3
exitcodes=0,2
stopsignal=TERM
stopwaitsecs=5
stopasgroup=true
killasgroup=true
stderr_logfile=/var/log/cron_jobs_with_codeigniter.err.log
stdout_logfile=/var/log/cron_jobs_with_codeigniter.out.log

相关内容