在给定程序的所有实例完成时关闭计算机

时间:2017-12-22 08:59:10

标签: linux bash command-line

我使用以下脚本检查wget是否已完成下载。为了检查这一点,我正在寻找它的PID,当它没有找到时,计算机就会关闭。这适用于wget的单个实例,但是,我希望脚本能够查找所有已经运行的wget程序。

#!/bin/bash

while kill -0 $(pidof wget) 2> /dev/null; do
for i in '-' '/' '|' '\'
do
    echo -ne "\b$i"
    sleep 0.1
done
done
poweroff

编辑:如果脚本会检查至少有一个wget实例是否正在运行并且只检查wget是否已完成并关闭,我会很高兴电脑。

3 个答案:

答案 0 :(得分:0)

我不认为杀人是一个正确的想法,

可能是像这样的一些事情

while [ 1 ] 
do
     live_wgets=0

     for pid in `ps -ef | grep wget| awk '{print $2}'` ;  # Adjust the grep
     do 
        live_wgets=$((live_wgets+1))
     done

     if test $live_wgets -eq 0; then # shutdown
         sudo poweroff; # or whatever that suits
     fi
     sleep 5; # wait for sometime 
done

答案 1 :(得分:0)

您可以通过以下方式调整脚本:

#!/bin/bash

spin[0]="-"
spin[1]="\\"
spin[2]="|"
spin[3]="/"

DOWNLOAD=`ps -ef | grep wget | grep -v grep`
while [ -n "$DOWNLOAD" ]; do
for i in "${spin[@]}"
do
    DOWNLOAD=`ps -ef | grep wget | grep -v grep`
    echo -ne "\b$i"
    sleep 0.1
done
done
sudo poweroff

但我建议使用 cron 代替主动等待方法,甚至使用wait

How to wait in bash for several subprocesses to finish and return exit code !=0 when any subprocess ends with code !=0?

答案 2 :(得分:0)

除了其他答案之外,您可以通过最初将wget的结果读入数组来满足至少一个pidof wget pid的检查,例如:

pids=($(pidof wget))
if ((${#pids[@]} > 0)); then 
    # do your loop
fi

这也提供了一种在每个wget操作完成时定期监视剩余pid的方法,例如,

修改

npids=${#pids[@]}                           ## save original number of pids
while (( ${#pids[@]} -gt 0 )); do           ## while pids remain
    for ((i = 0; i < npids; i++)); do       ## loop, checking remaining pids
        kill -0 ${pids[i]} || pids[$i]=     ## if not unset in array
    done
    ## do your sleep and spin
done
poweroff

可能还有很多方法可以做到。这只是我想到的一个。