Bash-启动和终止进程
我需要一些关于“简单”bash脚本的建议 我想启动大约500个程序“myprog”的实例,并在x秒后将它们全部杀死 简言之,我有一个在后台启动程序的循环,在Bash-启动和终止进程,bash,execution,Bash,Execution,我需要一些关于“简单”bash脚本的建议 我想启动大约500个程序“myprog”的实例,并在x秒后将它们全部杀死 简言之,我有一个在后台启动程序的循环,在sleep x(秒数)之后,pkill用程序名调用 我的问题是: 如何验证10秒后所有500个实例都在运行?ps和grep与计数相结合,还是有其他方法 如何计算pkill(或类似的kill函数)实际杀死了多少个进程(这样就不会有任何进程在实际时限之前终止) 如何重定向pkill(或类似kill函数)的输出,使其不输出终止的进程信息,从而终止5
sleep x
(秒数)之后,pkill
用程序名调用
我的问题是:
/initializeTest:line 250:7566。/$myprog
。重定向到/dev/null并没有奏效$获取它们的pid
,将它们存储在数组或列表中,然后使用kill-0
获取所有进程的状态&>
或2>&1
,因为它可能是写在stderr上的$获取它们的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的作业控件生成的。这就是为什么我的“重定向”失败的原因。谢谢你提供的非常有用的信息