2016-09-22 202 views
3

我有一个程序,我想开始。让我们说这个程序会运行一段时间(真)-loop(所以它不会终止我想写一个bash脚本其中:Bash:启动并杀死子进程

  1. 启动程序(./endlessloop &
  2. 等待1秒(sleep 1
  3. 害死程序 - ?!>如何

我不能使用$,因为服务器运行大量实例的同时,从孩子得到PID

+1

你试过了什么代码?它是如何失败的? – CAB

+1

我尝试了上面括号中的两件事。问题是:如何杀死无尽环境? –

回答

0

您可以用p对于相同的grep命令:

kill $(pgrep endlessloop) 
+0

使用'pkill'并称它为一天! – heemayl

+2

这会杀死每一个*无尽循环,而不仅仅是你开始的那个。它也会杀死'endlessloopctl'或'read-endlessloop-logs'。 –

+0

我不能在这里等一下? –

2

Store中的PID:

./endlessloop & endlessloop_pid=$! 
sleep 1 
kill "$endlessloop_pid" 

您还可以检查该进程是否仍与kill -0运行:

if kill -0 "$endlessloop_pid"; then 
    echo "Endlessloop is still running" 
fi 

...和存储变量中的内容意味着它可以扩展到多个进程:

endlessloop_pids=()      # initialize an empty array to store PIDs 
./endlessloop & endlessloop_pids+=("$!") # start one in background and store its PID 
./endlessloop & endlessloop_pids+=("$!") # start another and store its PID also 
kill "${endlessloop_pids[@]}"    # kill both endlessloop instances started above 

参见BashFAQ #68,“我如何运行一个命令,并将其N秒后中止(超时)?”

ProcessManagement页面上的Wooledge维基还讨论了相关的最佳实践。

+0

但我不想杀死所有无尽循环过程,只是一个开始... –

+0

@今天春天,这个答案就是这样。 '$ endlessloop_pid'只存储已启动的PID或者'endlessloop_pids'数组情况下的PID。 –

+0

关键是我无法区分哪一个是正确的要杀人。 –