2012-09-18 166 views
0

我不是程序员,也不是安全专家。我与保点工作,我有以下代码,由我制定了使用与检查点日志管理:Bash脚本 - 守护进程

#!/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 [email protected]$SCP_IP:$SCP_DEST_DIR && rm $i || break 1; 
    done 
} 

# Work 
if [ "$#" -ne 1 ] 
then 
    usage 
else 
    case "[email protected]" 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 

脚本手动运行时运行正常,但是当我把在crontab中nohup /etc/scripts/log start 0<&- 1>> /var/log/LOG 2>&1 &甚至来自终端和退出运行和登录,脚本无法循环/运行,但它仍然从ps运行。

有人可以帮助我吗?

此外,bash版本是CheckPoint的2.05b版本,但如果手册中的内容一切正常,我认为版本不是原因。

+1

通过手动模式,您的意思是您正在终端运行'/ etc/scripts/log start 0 <&- 1>>/var/log/LOG 2>&1'并且正在运行,那么它也应该与'nohup'一起工作。你如何得出它*不工作*? –

+0

我得出这样的结论,因为我看不到日志增加,日志压缩等完成工作,所以没有运行。感谢你的回答 !!! –

+1

请参阅下面的@ jonathan's asnwer。一旦你解决了这些问题,脚本就可以工作。虽然我怀疑你的说法,它是从终端工作.. –

回答

2

考虑到文件列表的顶部:

SLEEP=600 
RUN_TIME=01 
... 
TIME=$(clock | awk {'print $4'} | cut -d ':' -f 1) 

这是一个有点出人意料:

if [ "$TIME" -eq "$RUN_TIME" ] ; then 

没有什么变化的值,所以无论你是幸运的,并从clock输出(不是我熟悉的命令)匹配01,或者它不匹配。如果匹配,则循环将执行do_scp操作;否则,它会执行do_compression操作。但是,一旦启动,我就看不到任何事情会使它做出其他行动。

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

+0

我猜他错误地使用'时钟'而不是'日期'。但令人惊讶的是,他声称从终端运行时它正在工作。 –

+0

时钟是CheckPoint命令。谢谢你的回答,我相信你是对的!这没什么增加或检查$ TIME ...我检查了日志,现在我可以看到它重复“如果15 = 01”...所以它不是真的增加。非常感谢。 –

+0

@ KingsIndian感谢您的观察。实际上“时钟”与“日期”LOL,相同的输出等等是一样的。只是为了CheckPoint的原因,他们重新命名了命令。谢谢 ! –