我有一台服务器运行数据库的后端脚本(ETL 进程等)。然而,我们每天有两个小时专门用来发送电子邮件。电子邮件是重中之重,但是,有时它们会占用大量内存,并且服务器上的所有进程都会崩溃。因此,我想在电子邮件系统运行时暂时暂停所有 ETL 脚本(用 Python 编写)。一旦完成,我希望它在电子邮件系统完成后恢复这些脚本。
假设电子邮件系统在三个 cron 上运行,并具有以下可执行文件:
/usr/bin/php /home/Email/main.php --action=set1
/usr/bin/php /home/Email/main.php --action=set2
/usr/bin/php /home/Email/main.php --action=set3
我可以将这三个包装到一个脚本文件中。但是,在该脚本中我需要暂停并启动所有 Python 脚本。通过在堆栈交换上搜索,我似乎可以运行以下命令:
kill -TSTP [pid]
/usr/bin/php /home/Email/main.php --action=set1 &
/usr/bin/php /home/Email/main.php --action=set2 &
/usr/bin/php /home/Email/main.php --action=set3 &
wait
kill -CONT [pid]
其中 pid 是我的 Python 脚本的进程 ID(有多个脚本)。我的问题是,如何调整它以检索所有正在运行的 Python 脚本的 pid 并在其中循环它们?注意:这是在 Ubuntu 14.04.2 上运行的。任何其他建议也将不胜感激。谢谢。
解决方案
我的系统上的解决方案如下:
pkill -STOP python
/usr/bin/php /home/Email/main.php --action=set1
/usr/bin/php /home/Email/main.php --action=set2
/usr/bin/php /home/Email/main.php --action=set3
pkill -CONT python
答案1
答案2
检查killall
或pkill
(pgrep
)。
但我认为对于我们的情况来说最好的方法是:设置一个简单的只发送 MTA,将消息排队,并将其设置为高优先级(使用nice
),以便您的 PHP 代码不会中断,并且发送(慢的网络上创建的连接、与另一端 MTA 的初始连接速度较慢 [反垃圾邮件功能])可以并行进行,而不会减慢其余部分的速度。