2012-09-18 186 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的原因,他們重新命名了命令。謝謝 ! –