BASH通过重新启动来保持反击

时间:2014-12-30 18:20:00

标签: bash

我正在尝试在我的bash脚本中保留一个外部计数器。

由于大部分脚本都是针对它的目的,我只会插入一些我似乎无法工作的相关部分。以前的一切都得到了定义。在有人评论猫之前,我也试过(< $ TMPFILE)。该问题似乎没有写入文件。

#!/bin/bash
TMPFILE="/tmp/nettestnum"
if [ -e "$TMPFILE" ]; then I=$(cat $TMPFILE); else I="1"; fi

nettest_start() {
    grep -q "/root/bin/nettest" /etc/rc.local
    if [ $? -eq 1 ]; then
        sed -i 's|touch /var/lock/subsys/local|touch /var/lock/subsys/local \&\& /root/bin/nettest|' /etc/rc.local 2>&-
        echo "Script started at $DATEVAL"  >> "$LOGFILE" 2>&1
        echo "Script will run every $TIMELb minutes, $LIMIT times"
        touch "$TMPFILE"
        nettest_run
    else
        echo "Nettest is already started and will relaunch upon next reboot"
    fi

}

nettest_run() {
    echo "$DATE : Starting scan" >> "$LOGFILE" 2>&1
    #

    while [[ "$I" -lt "$LIMIT" ]]
    do
        echo "$DATE : Starting scan" >> "$LOGFILE" 2>&1
        #
        HOSTS="$(...)"


        for myHost in $HOSTS
        do

            PING=$(ping -f -c $COUNT "$myHost" |grep 'rtt' | awk '{print $4}')
            echo "$myHost / $PING" >> "$LOGFILE" 2>&1
        done
        echo "$DATEVAL : Finished" >> "$LOGFILE" 2>&1
        echo "$DATEVAL : Netstat Start" >> "$STATLOG" 2>&1
        netstat -s |egrep -i "dropped|loss|reject|timeout|invalid" >> "$STATLOG" 2>&1
        echo "$DATEVAL : Netstat Finished" >> "$STATLOG"G 2>&1
        echo "." >> "$LOGFILE" 2>&1
        sleep "$TIMEL"
        let I++ || true
        set +C
        echo "$I" > "$TMPFILE"
    done
}

编辑4:重新添加}并显示两个功能。

我还需要弄清楚如何为循环编写一个退出,但我很确定这只是一个[$? = 0]

编辑: 我在运行状态命令时看到的一些输出示例(内置于脚本中)..

Nettest is enabled on startup
PID number: 6059
Nettest is actively running in memory
On iteration  of 100

迭代在第一次运行时显示1。

编辑2:使用完整示例重新编写示例,减去自定义命令。

3 个答案:

答案 0 :(得分:1)

最后,我通过在所需的行中添加2>& 1来实现它。

echo "$I" > "$TMPFILE" 2>&1

答案 1 :(得分:0)

试试这个:

if [ -e "$TMPFILE" ]; then I=`cat $TMPFILE`; else I=1; fi

while [[ $I -lt $LIMIT ]]

答案 2 :(得分:0)

while循环创建一个子shell,其中包含所有当前变量的副本。

#!/bin/bash
I=1
CHECK=1 # boolean for demonstration
while CHECK; do
    let I++
    CHECK=0
done
echo $I # prints 1, not two

这是因为while子shell获取I变量的副本,它会递增。一旦子shell退出,原始变量就会返回。

您的I变量正在递增,并充当您的循环计数器。我希望这会给你带来各种问题,以便正确地结束你的循环,并且让这个程序的其他部分看到"对"变量。我认为没有理由不能用等效的for循环替换while循环,并完全避免所有这些问题。