4

我有一个简单的 shell 脚本,它也在下面:

#!/usr/bin/sh

echo "starting the process which is a c++ process which does some database action for around 30 minutes"
#this below process should be run in the background
<binary name> <arg1> <arg2>

exit

现在我想要的是监控和显示进程的状态信息。我不想深入研究它的功能。由于我知道该过程将在 30 分钟内完成,因此我想向用户显示每 1 分钟完成 3.3% 并检查该过程是否在后台运行,最后如果该过程完成我想显示它完成了。

有人可以帮我吗?

4

3 回答 3

3

您可以做的最好的事情是在您的应用程序中放置某种检测工具,并让它以work items processed / total amount of work.

否则,您确实可以参考事物运行的时间。

这是我过去使用的示例。在 ksh93 和 bash 中工作。

#! /bin/ksh
set -u
prog_under_test="sleep"
args_for_prog=30

max=30 interval=1 n=0

main() {
    ($prog_under_test $args_for_prog) & pid=$! t0=$SECONDS

    while is_running $pid; do
        sleep $interval
        (( delta_t = SECONDS-t0 ))
        (( percent=100*delta_t/max ))
        report_progress $percent
    done
    echo
}

is_running() { (kill -0 ${1:?is_running: missing process ID}) 2>& -; }

function report_progress { typeset percent=$1
    printf "\r%5.1f %% complete (est.)  " $(( percent ))
}

main
于 2012-08-03T13:33:41.970 回答
1

如果您的流程涉及管道,那么http://www.ivarch.com/programs/quickref/pv.shtml将是一个很好的解决方案,或者替代方案是http://clpbar.sourceforge.net/。但是这些本质上就像带有进度条的“猫”,需要一些东西来通过它们。有一个小程序,您可以编译然后作为后台进程执行,然后在事情完成时终止,http://www.dreamincode.net/code/snippet3062.htm如果您只想显示某些内容 30 分钟,然后如果您的进程运行时间很长并且退出,那么这可能会起作用,然后在控制台中几乎完成打印,但是您必须对其进行修改。最好只创建另一个 shell 脚本,在循环中每隔几秒显示一个字符并检查前一个进程的 pid 是否仍在运行,我相信您可以通过查看 $$ 变量来获取父 pid,然后检查是否它仍在 /proc/pid 中运行。

于 2012-08-03T12:27:15.877 回答
0

你真的应该让命令输出统计信息,但为了简单起见,你可以做这样的事情来在你的进程运行时简单地增加一个计数器:

#!/bin/sh

cmd &  # execute a command
pid=$! # Record the pid of the command
i=0
while sleep 60; do
  : $(( i += 1 ))
  e=$( echo $i 3.3 \* p | dc )   # compute percent completed
  printf "$e percent complete\r" # report completion
done &                           # reporter is running in the background
pid2=$!                          # record reporter's pid
# Wait for the original command to finish
if wait $pid; then
    echo cmd completed successfully
else
    echo cmd failed
fi      
kill $pid2        # Kill the status reporter
于 2012-08-03T19:02:09.543 回答