我有一个必须以特定频率运行的脚本。此脚本循环执行多个程序,在每个循环中设置一些变量。由于此脚本运行数小时,因此我使用 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。