Linux Shell,在后台运行命令时显示内容

时间:2013-07-04 01:53:22

标签: linux bash shell

我想制作一个简短的剧本,仅用于实验目的。例如,我运行一个命令,如

sudo apt-get install eclipse --yes

而不是在安装命令时显示命令的详细信息,而是显示一个加载栏 ...... (点加载时会弹出点或其他东西)

我尝试过像

这样的事情
apt=sudo apt-get install vlc --yes

start()
{
    $apt
    while $apt;
    do
        echo -n "."
        sleep 0.5
    done
}
start

(我打算做的是运行$ apt变量,然后让它继续进行while循环,while循环将确定命令是否正在运行,所以当命令运行时,它将替换verbose点)

3 个答案:

答案 0 :(得分:7)

apt-get install vlc --yes >/tmp/apt-get.log & # Run in background, with output redirected
pid=$! # Get PID of background command
while kill -0 $pid  # Signal 0 just tests whether the process exists
do
  echo -n "."
  sleep 0.5
done

将上述内容放入脚本中,然后通过sudo运行。您无法使用kill来测试sudo进程本身,因为您无法向具有其他uid的进程发送信号。

答案 1 :(得分:4)

以上是上述内容的一小部分......

spinner()
{
    local pid=$!
    local delay=0.75
    local spinstr='...'
    echo "Loading "
    while [ "$(ps a | awk '{print $1}' | grep $pid)" ]; do
        local temp=${spinstr#?}
        printf "%s  " "$spinstr"
        local spinstr=$temp${spinstr%"$temp"}
        sleep $delay
        printf "\b\b\b"
    done
    printf "    \b\b\b\b"
}

使用情况:

(a_long_running_task) &
spinner

打印

  

正在加载......

     

正在加载....

     

加载.....

     

加载......

当然在同一行。

答案 2 :(得分:1)

Whiptail是为您执行此操作的工具。

,当您完成任务时,可以很容易地为它显示进度条或其他信息。

实际上,它是Debian和许多其他发行版所使用的工具,与你正在使用的语境完全相同。

这是我们用来使aptitude安装更友好的代码的简化版本:

pkg=0
setterm -msg off # Disable kernel messages to this terminal
setterm -blank 0 # Disable screen blanking
aptitude -y install <list of packages> | \
    tr '[:upper:]' '[:lower:]' | \
while read x; do
    case $x in
        *upgraded*newly*)
            u=${x%% *}
            n=${x%% newly installed*}
            n=${n##*upgraded, }
            r=${x%% to remove*}
            r=${r##*installed, }
            pkgs=$((u*2+n*2+r))
            pkg=0
        ;;
        unpacking*|setting\ up*|removing*\ ...)
            if [ $pkgs -gt 0 ]; then
                pkg=$((pkg+1))
                x=${x%% (*}
                x=${x%% ...}
                x=$(echo ${x:0:1} | tr '[:lower:]' '[:upper:]')${x:1}
                printf "XXX\n$((pkg*100/pkgs))\n${x} ...\nXXX\n$((pkg*100/pkgs))\n"
            fi
        ;;
    esac
done | whiptail --title "Installing Packages" \
        --gauge "Preparing installation..." 7 70 0
setterm -msg on # Re-enable kernel messages
invoke-rc.d kbd restart # Restore screen blaking to default setting