终止脚本执行

终止脚本执行

我有一个必须以特定频率运行的脚本。此脚本循环执行多个程序,在每个循环中设置一些变量。由于此脚本运行数小时,因此我使用 linux“at”命令运行它,

    at now
    >> ./myscript >> output

但每隔一段时间,我就不得不终止该脚本。我所做的就是终止它执行的程序的 PID,使用 ps -A | grep 'name' 搜索它们。这里的问题是,由于存在循环,我可能会这样做很长时间。仅终止进程就需要 10 分钟。这效率不高。

如何找到几个小时或几天前使用“at now”启动的脚本的 PID?ps -A | grep 'bash' 没有提供已经运行了那么长时间的 bash 进程。

我想终止脚本,这样我就不必终止循环启动的所有进程,直到它完成,但找不到 PID。

答案1

如果您有pgrep并且pkill可用,这会更容易。

pgrep myscript.sh将获取 myscript.sh 的 pid。-o选项将获取最旧的 pid。

pgrep -P $myscriptPid因为上述命令中的 pid 将获取父脚本的所有子脚本。

pkill将采用相同的参数,但顾名思义......

如果pgrep不可用,ps -ef | awk '/myscript.sh/ && !/ awk / { print $2 }'将获取 pid

ps -ef | awk -v pid=$myscriptPid '{ if ( $3 == pid ) { print $2 }'将会得到你的脚本的子项。

这不会沿着进程树一直递归到子进程的子进程,但应该足够了

答案2

fuser 显示已打开文件输出的进程的 PID。

不过,更优雅的解决方案是使用 cgroups。您可以使用 systemd 来实现这一点。只需为您的脚本创建一个服务文件,然后使用以下命令启动它:

systemctl start myscript.service

如果你需要杀死它

systemctl stop myscript.service

终止脚本及其创建的所有进程。

我不明白这at now有什么用。如果您只是想将进程从终端分离,那么请使用 nohup 或 screen。给 screen 会话命名也会使终止脚本变得容易。

答案3

脚本进程应该以名称“myscript”显示。或者,您可以找到它执行的程序之一,并根据需要追溯 PPID。

相关内容