Bash脚本停止在密码promt上执行

时间:2015-06-23 09:01:12

标签: git bash shell

我有一些我需要定期更新的Git回购。所以我写了一个简单的bash脚本

cd /repo1/path
git fetch --all

cd /repo2/path
git fetch --all
...

此脚本通过cron作业运行。 Git中的授权是通过SSH完成的。这里的问题是,有时一个或另一个回购拒绝证书,从而提示输入密码(这是回购管理的问题,在问题中未解决)。一旦我的脚本遇到这样的回购,它就会停止并且(我猜)等待密码输入,所以在它之后的所有回购都没有得到更新。

问题是如何处理这种情况 - 一个失败的回购不应该阻止其他人更新。

1 个答案:

答案 0 :(得分:1)

可以使用这样的东西。

对于这个例子,我使用sleep而不是git来显示它如何更好地工作

#!/bin/bash

PIDS=()             # Make pid array

cd /repo1/path              #Go to dir
sleep 20 &                  #Command
x=$!                        #Save Pid
PIDS+=($x)                  #Add to pid array
Command[$x]="$(pwd)"        # Add to Command array(will contain failed dirs)

cd /repo1/path              #Same yo
sleep 20 &
x=$!
PIDS+=($x)
Command[$x]="$(pwd)"

cd /repo3/path
sleep 1 &                       #This one will exit before next part to show it doesn't
                                #appear in output
x=$!
PIDS+=($x)
Command[$x]="$(pwd)"

sleep 2                       # Literally here just so previous command finishes
                              #(not needed in a real script)

for i in "${PIDS[@]}";do      #Loop through the PIDS
        if ps -ef | grep -v "grep" | grep "$i" > /dev/null 2>&1 ;then
        #Check they're running, dump output
                kill "$i"                    #Kill running ones
                wait "$i" 2>/dev/null        # Suppress output
                echo "${Command[${i}]}" Failed    # echo failed dirs
        fi 
done

输出

/repo1/path Failed
/repo2/path Failed