我需要一些关于“简单”bash脚本的建议。
我想开始大约500个程序“myprog”的实例,并在x秒后杀死所有这些实例
简而言之,我有一个循环在后台启动程序,并在sleep x
(秒数)pkill
之后用程序名调用。
我的问题是:
如何验证10秒后所有500个实例都在运行? ps和grep与计数的组合还是有另一种方式?
如何计算pkill(或类似的kill函数)实际杀死的进程数(以便在实际时间限制之前没有任何进程终止)?
如何重定向pkill(或类似的kill函数)的输出,使其不输出被杀死的进程信息,从而可以避免500行./initializeTest: line 250: 7566 Terminated ./$myprog
。重定向到/ dev / null没有办法解决问题。
答案 0 :(得分:2)
在bash中有ulimit
命令来控制(子)shell的资源。
例如,保证最多使用 10秒的cpu时间然后死掉:
(ulimit -t 10; ./do_something)
这不能回答你的问题,但希望它有所帮助。
答案 1 :(得分:1)
我的2美分:
$!
获取它们的pid,将它们存储在数组或列表中,然后使用kill -0
来获取所有进程的状态。&>
或2>&1
,因为它可能写在stderr上MY2C
答案 2 :(得分:1)
为了确保每个进程在被杀死之前获得10秒的公平份额,我会将每个命令包含在子shell中,并使用它自己的sleep && kill
。
function run_with_tmout {
CMD=$1; TMOUT=$2
$CMD &
PID=$!
sleep $TMOUT
kill $PID
}
for ((i=0; i < 500; i++)); do
run_with_tmout ./myprog 10 &
done
# wait for all child processes to end
wait && echo "all done"
有关更完整的示例,请参阅this example from bashcookbook.com,首先检查流程是否仍在运行,然后在诉诸kill -s SIGTERM
之前尝试SIGKILL
。
答案 3 :(得分:1)
1,2。使用pgrep
。我不记得pgrep
是否有-c
参数,所以您可能需要将其传递给wc -l
。
3:输出由shell的作业控制产生。我想如果你把它作为脚本运行(不是在交互式shell中),那么就不应该有这样的输出。对于交互式shell,有多少方法可以关闭它,但它们与shell有关,所以请参考shell的手册。
答案 4 :(得分:0)
我一直在使用以下内容来获取pids列表。
PS=$(ps ax | sed s/^' '*// | grep java | grep program_name | cut -d' ' -f1)
然后我使用kill $PS
来阻止它们。
!/bin/bash
PS=$(ps ax | sed s/^' '*// | grep java | grep program_name | cut -d' ' -f1)
kill $PS