Bash脚本-守护进程

Bash脚本-守护进程,bash,shell,Bash,Shell,我不是程序员,也不是安全专家。我使用检查点,我有以下代码,由我开发用于检查点日志管理: #!/bin/bash - # Necessario carregar as variaveis do CheckPoint: . /etc/profile.d/CP.sh # Description: # Log management # Crontab: #0 */1 * * * nohup /etc/scripts/log start 0<&- 1>> /var/log/

我不是程序员,也不是安全专家。我使用检查点,我有以下代码,由我开发用于检查点日志管理:

#!/bin/bash -

# Necessario carregar as variaveis do CheckPoint:
. /etc/profile.d/CP.sh

# Description:
# Log management

# Crontab:
#0 */1 * * * nohup /etc/scripts/log start 0<&- 1>> /var/log/LOG 2>&1 &

# Vars:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/etc/scripts
FILE=/var/log/LOG
SLEEP=600
RUN_TIME=01
LOG_DIR=$FWDIR/log
GZIP_RET=1
SCP_RET=1
SCP_USR=openssh
SCP_DEST_DIR=LOGS_RJ
SCP_IP=192.168.1.41
TIME=$(clock | awk {'print $4'} | cut -d ':' -f 1)
CHECK=$(ps aux | grep 'log start' | grep -v grep | wc -l)
DATE=$(date +%y%m%d)

# Functions:

usage() {
    echo "Usage: $0 [start|stop]" >&2
    exit 1
}

do_launch() {
    if [ "$CHECK" -eq 2 ] ; then
        set -x
        #exec >> /var/log/LOG 2>&1
    else
        exit
    fi
}

do_compression() {
    SEARCH=`find "$LOG_DIR" -name '20*' -daystart -follow -mtime +$GZIP_RET | grep -v gz`
    for i in $SEARCH ; do
        gzip -f -9 $i ;
    done
}

do_scp() {
    SEARCH=`find "$LOG_DIR" -name '20*' -daystart -follow -mtime +$SCP_RET`
    for i in $SEARCH ; do
        scp $i $SCP_USR@$SCP_IP:$SCP_DEST_DIR && rm $i || break 1;
    done
}

# Work
if [ "$#" -ne 1 ]
then
    usage
else
    case "$@" in
        start)
            while true ; do
                do_launch
                while true ; do
                    if [ "$TIME" -eq "$RUN_TIME" ] ; then
                        do_scp
                    else
                        do_compression
                    fi
                    sleep $SLEEP
                done
            done
            ;;
        stop)
            pkill -x log
            ;;
        *)
        usage
    esac
fi

exit
#/bin/bash-
#必要的carregar作为variaveis检查点:
. /etc/profile.d/CP.sh
#说明:
#日志管理
#Crontab:
#0*/1***nohup/etc/scripts/log start 0>/var/log/log 2>&1&
#变量:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/etc/scripts
文件=/var/log/log
睡眠=600
运行时间=01
LOG_DIR=$FWDIR/LOG
GZIP_RET=1
SCP_RET=1
SCP_USR=openssh
SCP\u DEST\u DIR=日志\u RJ
SCP_IP=192.168.1.41
时间=$(时钟| awk{'print$4'}| cut-d':'-f1)
检查=$(ps aux | grep“日志开始”| grep-v grep | wc-l)
日期=$(日期+%y%m%d)
#职能:
用法(){
echo“用法:$0[开始|停止]”>&2
出口1
}
do_launch(){
如果[“$CHECK”-等式2];则
集合x
#exec>>/var/log/log 2>&1
其他的
出口
fi
}
do_压缩(){
SEARCH=`find“$LOG_DIR”-name“20*”-daystart-follow-mtime+$GZIP_RET | grep-v gz`
因为我在$SEARCH;do
gzip-f-9$i;
完成
}
do_scp(){
SEARCH=`find“$LOG\u DIR”-name“20*”-daystart-follow-mtime+$SCP\u RET`
因为我在$SEARCH;do
scp$i$scp|U USR@$scp|U IP:$scp|U DEST|u DIR和rm$i||u break 1;
完成
}
#工作
如果[“$#”-ne 1]
然后
使用
其他的
中的大小写“$@”
开始)
虽然真实;做
发射吗
虽然真实;做
如果[“$TIME”-eq“$RUN_TIME”];然后
do_scp
其他的
做压缩
fi
睡眠$sleep
完成
完成
;;
(停止)
pkill-x日志
;;
*)
使用
以撒
fi
出口
手动运行时脚本运行良好,但当我放入crontab
nohup/etc/scripts/log start 0>/var/log/log 2>&1&
或甚至从终端运行并注销和登录时,脚本无法循环/运行,但它仍然从
ps
运行

有人能帮我吗


另外,bash版本是CheckPoint的2.05b版本,但是如果手动操作一切正常,我认为这不是原因。

鉴于文件顶部列出了:

SLEEP=600
RUN_TIME=01
...
TIME=$(clock | awk {'print $4'} | cut -d ':' -f 1)
这有点令人惊讶:

if [ "$TIME" -eq "$RUN_TIME" ] ; then
没有任何东西会改变这些值,因此您很幸运,
clock
(不是我熟悉的命令)的输出与
01
匹配,或者不匹配。如果匹配,则循环将执行
do\u scp
操作;否则,它将执行
do_compression
操作。然而,一旦启动,我看不到任何东西能让它做其他的动作


要解决这个问题,您可能需要评估每次迭代的时间。您还需要考虑选择用于处理这两个动作之间切换的方法是否合适;我认为这是可疑的。

手动模式的意思是,您正在从终端运行
/etc/scripts/log start 0>/var/log/log 2>&1
,并且正在运行,那么它也应该与
nohup
一起工作。你怎么断定它不工作?我断定它没有运行,因为我看不到日志正在增加,也看不到日志正在压缩,等等正在完成这项工作。谢谢你的回答!!!见下面的@jonathan's asnwer。一旦解决了这些问题,脚本就可以工作了。虽然我怀疑你的说法,它是从终端工作的..我猜他错用了
时钟
而不是
日期
。但令人惊讶的是,他声称当从终端运行时,时钟是一个检查点命令。谢谢你的回答,我相信你是对的!这不是增加或检查$TIME。。。我检查了日志,现在我可以看到它重复“If15=01”。。。所以它实际上没有增加。非常感谢。@KingsIndian感谢您的观察。实际上,“时钟”与“日期”LOL相同,输出相同,等等。只是出于检查点的原因,他们重命名了该命令。谢谢你们真是太棒了!谢谢我的问题解决了!乔纳森,你的回答是对的。谢谢大家。