我有一些机器人,它们由系统调度程序按给定的时间间隔运行。但有时由于一些逻辑错误,我必须手动停止这些机器人。如何找到调度程序运行的这些进程并杀死它们?
答案1
您可以按名称终止进程。例如,在 Linux、*BSD 和 Solaris 上,终止名称包含(用于完全匹配)pkill myprogram
的所有进程。如果您以非 root 用户身份运行它,则只有该用户的进程将被终止,并且还有更多选项可以控制匹配(有关详细信息,请参阅系统上的手册)。myprogram
pkill '^myprogram$'
如果您想专门针对由调度程序启动的进程,并且您要手动终止进程,则可以运行ps f
(仅限 Linux)或pstree
(仅限 Linux)或ptree
在树中显示进程,并查看哪些进程是由 cron 启动的。
如果您希望能够通过自制方法自动终止这些进程,请让它们将进程 ID 存储在文件中。这种文件称为pid文件当它用于仅运行进程的单个实例时(这可能是也可能不是您想要的)。如果您想要多个实例,请将 PID 存储在公共目录中的单独文件中;这是执行此操作的 shell 片段:
pid_dir=/var/run/myprogram # must have been created e.g. at boot time
myprogram &
pid_file=$pid_dir/$!.pid
touch "$pid_file"
wait
rm "$pid_file"
如果您有检测失控进程的硬性标准,更好的解决方案是使用通用监视程序,或者在简单的情况下仅限制允许进程运行的时间。您可能会发现这些链接很有帮助:
- “莫尼特如果进程没有运行,则可以启动它;如果进程没有响应,则可以重新启动进程;如果进程使用太多资源,则可以停止进程。”
- 我需要 cronjob 的帮助来监视失控的进程并杀死它们
- 如何限制某个进程的资源使用以节省CPU+RAM?
- 有没有办法限制 Unix 中特定进程可以使用的内存量?
答案2
我建议在生成它们后将它们的 PID ($$) 弹出到一个文件中。然后您可以使用它来终止该进程。
答案3
大多数编程语言中用于查找无限循环或其他错误情况的基本 try/catch 分支应该可以工作。可能是进程上有一个不活动/无响应的计时器来监视挂起。