Bis*_*Das 133 bash scripting process wait
bash中是否有任何内置功能可以等待任何进程完成?该wait命令仅允许等待子进程完成.我想知道在继续执行任何脚本之前是否有任何方法可以等待任何进程完成.
这样做的机械方法如下,但我想知道bash中是否有任何内置功能.
while ps -p `cat $PID_FILE` > /dev/null; do sleep 1; done
Run Code Online (Sandbox Code Playgroud)
Rau*_*ari 114
Linux的:
tail --pid=$pid -f /dev/null
Run Code Online (Sandbox Code Playgroud)
达尔文(要求$pid打开文件):
lsof -p $pid +r 1 &>/dev/null
Run Code Online (Sandbox Code Playgroud)
Linux的:
timeout $timeout tail --pid=$pid -f /dev/null
Run Code Online (Sandbox Code Playgroud)
达尔文(要求$pid打开文件):
lsof -p $pid +r 1m%s -t | grep -qm1 $(date -v+${timeout}S +%s 2>/dev/null || echo INF)
Run Code Online (Sandbox Code Playgroud)
Ted*_*ddy 77
没有内置.使用kill -0在一个可行的解决方案的循环:
anywait(){
for pid in "$@"; do
while kill -0 "$pid"; do
sleep 0.5
done
done
}
Run Code Online (Sandbox Code Playgroud)
或者作为一个简单的oneliner,便于一次性使用:
while kill -0 PIDS 2> /dev/null; do sleep 1; done;
Run Code Online (Sandbox Code Playgroud)
正如几位评论员所指出的,如果您想等待没有权限发送信号的进程,您可以找到一些其他方法来检测进程是否正在运行以替换该kill -0 $pid调用.在Linux上,test -d "/proc/$pid"可以在其他系统上使用pgrep(如果可用)或类似的东西ps | grep "^$pid ".
mp3*_*ley 51
我发现如果进程由root(或其他)拥有,"kill -0"不起作用,所以我使用了pgrep并提出:
while pgrep -u root process_name > /dev/null; do sleep 1; done
Run Code Online (Sandbox Code Playgroud)
这将具有可能匹配僵尸进程的缺点.
tei*_*ura 31
如果进程不存在,或者它是僵尸,则此bash脚本循环结束.
PID=<pid to watch>
while s=`ps -p $PID -o s=` && [[ "$s" && "$s" != 'Z' ]]; do
sleep 1
done
Run Code Online (Sandbox Code Playgroud)
编辑:以上脚本以下给出 的Rockallite.谢谢!
我的orignal答案适用于Linux,依赖于procfsie /proc/.我不知道它的便携性:
while [[ ( -d /proc/$PID ) && ( -z `grep zombie /proc/$PID/status` ) ]]; do
sleep 1
done
Run Code Online (Sandbox Code Playgroud)
它不仅限于shell,但OS本身没有系统调用来监视非子进程终止.
Mik*_* T. 14
FreeBSD和Solaris有这个方便的pwait(1)实用程序,它可以完全满足您的需求.
我相信,其他现代操作系统也有必要的系统调用(例如MacOS,实现BSD kqueue),但并非所有操作系统都可以从命令行使用.
来自bash手册页
wait [n ...]
Wait for each specified process and return its termination status
Each n may be a process ID or a job specification; if a
job spec is given, all processes in that job's pipeline are
waited for. If n is not given, all currently active child processes
are waited for, and the return status is zero. If n
specifies a non-existent process or job, the return status is
127. Otherwise, the return status is the exit status of the
last process or job waited for.
Run Code Online (Sandbox Code Playgroud)
所有这些解决方案都在Ubuntu 14.04中进行了测试:
解决方案1(通过使用ps命令): 只是加起来为Pierz答案,我建议:
while ps axg | grep -vw grep | grep -w process_name > /dev/null; do sleep 1; done
Run Code Online (Sandbox Code Playgroud)
在这种情况下,grep -vw grep确保grep仅匹配process_name而不匹配grep本身.它的优点是支持process_name不在行末尾的情况ps axg.
解决方案2(使用top命令和进程名称):
while [[ $(awk '$12=="process_name" {print $0}' <(top -n 1 -b)) ]]; do sleep 1; done
Run Code Online (Sandbox Code Playgroud)
替换process_name为出现的进程名称top -n 1 -b.请保留引号.
要查看等待它们完成的进程列表,您可以运行:
while : ; do p=$(awk '$12=="process_name" {print $0}' <(top -n 1 -b)); [[ $b ]] || break; echo $p; sleep 1; done
Run Code Online (Sandbox Code Playgroud)
解决方案3(使用top命令和进程ID):
while [[ $(awk '$1=="process_id" {print $0}' <(top -n 1 -b)) ]]; do sleep 1; done
Run Code Online (Sandbox Code Playgroud)
替换process_id为程序的进程ID.
好的,所以似乎答案是 - 不,没有内置工具.
设置/proc/sys/kernel/yama/ptrace_scope后0,可以使用该strace程序.可以使用其他开关使其静音,以便它实际上被动地等待:
strace -qqe '' -p <PID>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
135843 次 |
| 最近记录: |