我有一个脚本,我必须以一定的频率运行。 这个脚本在一个循环中执行一些程序,在每个循环中设置一些variables。 由于这个脚本运行了几个小时,我使用linux的“at”命令doint来运行它
at now >> ./myscript >> output
但每过一段时间,我都不得不杀死剧本。 我所做的是杀死它执行的程序的PID,用ps -A |search它们 grep'name'。 这里的问题是,因为有一个循环,我可以做很长一段时间。 10分钟只是杀死进程。 这是不高效的。
我怎样才能find一个脚本的PID,在几个小时或者几天之前用“现在”来启动? ps -A | grep'bash'没有给出长时间运行的bash进程。
我想杀死脚本,所以我不必杀死循环启动的所有进程,直到完成,但无法findPID。
如果你有pgrep和pkill可用,这更容易。
pgrep myscript.sh将会为你提供pgrep myscript.sh的pid(s)。 一个-o选项会让你最老的pid。
从上述命令的pid的pgrep -P $myscriptPid将得到你的父母脚本的所有孩子。
pkill将采取相同的参数,但顾名思义…
如果pgrep不可用, ps -ef | awk '/myscript.sh/ && !/ awk / { print $2 }' ps -ef | awk '/myscript.sh/ && !/ awk / { print $2 }'会让你的pid(s)
ps -ef | awk -v pid=$myscriptPid '{ if ( $3 == pid ) { print $2 }' ps -ef | awk -v pid=$myscriptPid '{ if ( $3 == pid ) { print $2 }'会得到脚本的子元素。
这不会一直拖延到儿童的子程序树,但应该是足够的
fuser将显示打开文件输出的进程的PID。
虽然更优雅的解决scheme是使用cgroups。 你可以使用systemd的。 只需为您的脚本创build一个服务文件,并启动它
systemctl start myscript.service
如果你需要杀死它
systemctl stop myscript.service
杀死脚本及其创build的所有进程。
我不明白at now有什么用。 如果你只是想从terminal分离进程,然后使用nohup或屏幕。 给屏幕会话一个名字也会使脚本变得简单。
脚本进程应该显示名字“myscript”。 或者,您可以find其中一个执行的程序,并根据需要追踪PPID。