Bash - 启动和终止进程

时间:2011-02-21 13:39:32

标签: bash execution

我需要一些关于“简单”bash脚本的建议。

我想开始大约500个程序“myprog”的实例,并在x秒后杀死所有这些实例

简而言之,我有一个循环在后台启动程序,并在sleep x(秒数)pkill之后用程序名调用。

我的问题是:

  1. 如何验证10秒后所有500个实例都在运行? ps和grep与计数的组合还是有另一种方式?

  2. 如何计算pkill(或类似的kill函数)实际杀死的进程数(以便在实际时间限制之前没有任何进程终止)?

  3. 如何重定向pkill(或类似的kill函数)的输出,使其不输出被杀死的进程信息,从而可以避免500行./initializeTest: line 250: 7566 Terminated ./$myprog。重定向到/ dev / null没有办法解决问题。

5 个答案:

答案 0 :(得分:2)

在bash中有ulimit命令来控制(子)shell的资源。

例如,保证最多使用 10秒的cpu时间然后死掉:

(ulimit -t 10; ./do_something)

这不能回答你的问题,但希望它有所帮助。

答案 1 :(得分:1)

我的2美分:

  1. ps和grep可以完成这项工作。顺便说一下,我发现kill -0 $ pid更好:)(它会告诉你进程是否正在运行)
  2. 您可以使用ps / grep或kill -0。对于您的问题,我将在后台启动所有进程并使用$!获取它们的pid,将它们存储在数组或列表中,然后使用kill -0来获取所有进程的状态。
  3. 使用&>2>&1,因为它可能写在stderr上
  4. 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