Bash-启动和终止进程

Bash-启动和终止进程,bash,execution,Bash,Execution,我需要一些关于“简单”bash脚本的建议 我想启动大约500个程序“myprog”的实例,并在x秒后将它们全部杀死 简言之,我有一个在后台启动程序的循环,在sleep x(秒数)之后,pkill用程序名调用 我的问题是: 如何验证10秒后所有500个实例都在运行?ps和grep与计数相结合,还是有其他方法 如何计算pkill(或类似的kill函数)实际杀死了多少个进程(这样就不会有任何进程在实际时限之前终止) 如何重定向pkill(或类似kill函数)的输出,使其不输出终止的进程信息,从而终止5

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

我想启动大约500个程序“myprog”的实例,并在x秒后将它们全部杀死

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

我的问题是:

  • 如何验证10秒后所有500个实例都在运行?ps和grep与计数相结合,还是有其他方法

  • 如何计算pkill(或类似的kill函数)实际杀死了多少个进程(这样就不会有任何进程在实际时限之前终止)

  • 如何重定向pkill(或类似kill函数)的输出,使其不输出终止的进程信息,从而终止500行
    /initializeTest:line 250:7566。/$myprog
    。重定向到/dev/null并没有奏效

  • 我的2美分:

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

    我的2美分:

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

  • my2c

    为了确保每个进程在被终止前获得公平的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"
    
    函数运行时带有\u tmout{
    CMD=$1;TMOUT=$2
    $CMD&
    PID=$!
    睡吧
    杀死$PID
    }
    对于((i=0;i<500;i++);做
    用\u tmout运行\u。/myprog 10&
    完成
    #等待所有子进程结束
    等待(&E)回显“全部完成”
    

    有关更完整的示例,请参见哪个先检查进程是否仍在运行,然后在诉诸
    SIGKILL

    之前尝试
    kill-s SIGTERM
    ,以确保每个进程在被终止前获得公平的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"
    
    函数运行时带有\u tmout{
    CMD=$1;TMOUT=$2
    $CMD&
    PID=$!
    睡吧
    杀死$PID
    }
    对于((i=0;i<500;i++);做
    用\u tmout运行\u。/myprog 10&
    完成
    #等待所有子进程结束
    等待(&E)回显“全部完成”
    

    有关更完整的示例,请参见哪个先检查进程是否仍在运行,然后在诉诸
    SIGKILL
    1,2之前尝试
    kill-s SIGTERM
    。使用
    pgrep
    。我记不得
    pgrep
    是否有
    -c
    参数,因此您可能需要将该参数传输到
    wc-l


    3:该输出由shell的作业控件生成。我认为,如果您将其作为脚本运行(而不是在交互式shell中),就不应该有这样的输出。对于交互式shell,有许多方法可以关闭它,但它们取决于shell,因此请参阅shell手册。

    1,2。使用
    pgrep
    。我记不得
    pgrep
    是否有
    -c
    参数,因此您可能需要将该参数传输到
    wc-l


    3:该输出由shell的作业控件生成。我认为,如果您将其作为脚本运行(而不是在交互式shell中),就不应该有这样的输出。对于交互式shell,有许多方法可以关闭它,但它们依赖于shell,因此请参阅shell手册。

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

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

    (ulimit -t 10; ./do_something)
    

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

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

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

    (ulimit -t 10; ./do_something)
    

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

    我一直在使用以下类似的方法来获取PID列表

    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
    

    我一直在使用下面这样的方法来获取PID列表

    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
    

    谢谢你的快速回复。当我尝试重定向时,我使用&>来重定向所有不起作用的输出。重定向到stdout然后再重定向到/dev/null也不起作用。感谢您的快速响应。当我尝试重定向时,我使用&>来重定向所有不起作用的输出。重定向到stdout然后再重定向到/dev/null也不起作用。感谢您提供的有用提示。pgrep确实有-c标志,并给出与ps | grep combo相同的结果。从现在起,我们将使用它使事情更具可读性。@Milan:这不仅更具可读性,而且实际上更可靠。(例如,
    ps | grep combo
    可能与
    grep
    本身相匹配,因为
    combo
    在其命令行中。)这是非常正确的。当我计算实例时,我总是使用grep[x]xxx,但如果累了,可能会错过它。输出确实是由shell的作业控件生成的。这就是为什么我的“重定向”失败的原因。谢谢你提供的非常有用的信息