2011-01-25 11:09

[Shell] backup mysql data by day (note)

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH

DATE=$(date +%Y%m%d)
TARGET=/root/my_backup
OPT="--opt -c -n -t --skip-triggers"
ID="root"
PW="1234"
DB="mydb"

TMP=$TARGET/$DB.$DATE.bak.sql"
BAK=$TARGET/$DB.$DATE.bak.tgz"

#==( Backup MySQL )=======================================
mysqldump -u$ID -P$PW $OPT $DB > $TMP
tar -zcf $BAK $TMP
rm $TMP

exit 0
2011-01-25 10:14

[Shell] 依據遠端清單進行目錄同步

這個任務的狀況是:
有些新的檔案會被加入,而舊的檔案會被移除,檔案的內容基本上是不會變動的,所以可透過檔名來進行同步。


檔案下載與錯誤處理:
這裡用 curl 來處理下載的問題,並且當發生錯誤時重試三次。
#!/bin/bash
# download_file.sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH

LIMIT=3 # retry 3 times
LOCAL_PATH=$1
REMOTE_URL=$2
FILE_NAME=$3

while [ $LIMIT \> 0 ] ; do
    #echo $REMOTE_URL/$FILE_NAME
    rm -f $LOCAL_PATH/$FILE_NAME.tmp
    curl -f -o $LOCAL_PATH/$FILE_NAME.tmp $REMOTE_URL/$FILE_NAME  > /dev/null
    if [ "$?" == "0" ]; then
        mv -f $LOCAL_PATH/$FILE_NAME.tmp $LOCAL_PATH/$FILE_NAME
        exit 0;
    fi
    LIMIT=$(($LIMIT-1))
done      

exit 1;


清單比較:
從遠端下載檔案清單與本地端的目錄進行比對,並處理刪除跟下載的動作。
#!/bin/bash
# folder_sync.sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH

REMOTE_URL=http://remote_site/pics
REMOTE_LIST_URL=http://remote_site/pics/file.list
LOCAL_PATH=/var/www/pics

# get remote list
REMOTE_LIST=$(curl -f $REMOTE_LIST_URL |tr -d '\r')
if [ "$?" != "0" ]; then  exit 1; fi

# get local list
cd $LOCAL_PATH
LOCAL_LIST=$(ls -1)
if [ "$?" != "0" ]; then
    LOCAL_LIST=""
fi    


# Check loacl file exists in the list
for ITEM in  $LOCAL_LIST ; do
    echo "$REMOTE_LIST" |grep "^$ITEM\$"  > /dev/null
    if [ "$?" != "0" ]; then
        # delete old file
        rm -f $ITEM  &> /dev/null
    fi
done

# Check remote file exists in the list
for ITEM in  $REMOTE_LIST ; do
    echo "$LOCAL_LIST" |grep "^$ITEM\$"  > /dev/null
    if [ "$?" != "0" ]; then
        # download new file
        download_file.sh $LOCAL_PATH $REMOTE_URL $ITEM &> /dev/null
    fi
done

exit 0;
2011-01-24 16:29

[Shell] 透過版本編號與遠端的 package 同步

有一個的任務是要將一個用 tar 封裝的目錄從 server 端同步到 client 上,然後有機個考量點:
  • 必須確保 client 永遠都讀得到資料
  • 最小的資料中斷
  • 最小的硬碟存取
  • 必要的錯誤處理


建立 server 端的 package
#!/bin/bash
# package_build.sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH

PROJECT_NAME=metadata
SOURCE_PATH=/var/projects
PORTING_PATH=/var/www

PACKAGE_NAME=$PROJECT_NAME.$(/bin/date +%s)
OLD_PACKAGE=$(find $PORTING_PATH -name "$PROJECT_NAME.*.tgz")

# Create Package
cd $SOURCE_PATH/$PROJECT_NAME
tar -zcf $PORTING_PATH/$PACKAGE_NAME.tgz ./*

# Update version number to release
echo $PACKAGE_NAME > $PORTING_PATH/$PROJECT_NAME.latest

# remove old version
#rm -f $OLD_PACKAGE

echo -e "<< $PACKAGE_NAME package complete >>"
exit 0


client 端的同步處理
#!/bin/bash
# package_sync.sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH

REMOTE_URL=http://remote_site/
TARGET_PATH=/var/www
PROJECT_NAME=metadata
PROJECT_PATH=$TARGET_PATH/$PROJECT_NAME


# get now version
NOW_VERSION=$PROJECT_NAME.0000000000
if [ -h "$PROJECT_PATH" ] && [ -d "$PROJECT_PATH" ]; then
    NOW_VERSION=$(readlink $PROJECT_PATH)
fi
echo -e 'NOW_VERSION' $NOW_VERSION


# get remote version 
REMOTE_VERSION=$(curl -f $REMOTE_URL/$PROJECT_NAME.latest |tr -d '\r')
if [ "j$?" != "j0" ]; then  exit 1; fi
echo -e 'REMOTE_VERSION' $REMOTE_VERSION


# deff version, not deff goto exit.
if [ ! "$NOW_VERSION" \< "$REMOTE_VERSION" ]; then  exit 0; fi



echo -e "Update package"

# create now version folder
mkdir -p $TARGET_PATH/$REMOTE_VERSION
if [ "$?" != "0" ]; then  exit 1; fi

# Download Package
cd $TARGET_PATH/$REMOTE_VERSION
curl -o $PROJECT_NAME.tgz $REMOTE_URL/$REMOTE_VERSION.tgz
if [ "$?" != "0" ]; then  exit 1; fi

# Decompression Package
tar -zxf $PROJECT_NAME.tgz
rm -f $PROJECT_NAME.tgz

# Update version link
cd $TARGET_PATH
ln -sfn $REMOTE_VERSION $PROJECT_NAME

# remove old version
rm -rf $NOW_VERSION

exit 0;
2011-01-24 13:47

[Shell] 等待所有子程序結束

當在用 shell 開其他子程序時,通常會希望在所有程序結束時做一些處理,最簡單的方式就是用一支迴圈去等待其他子程序的結束,這裡用到 jobs 這個指令去檢查子程序是不是還在執行。

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH

# job msg log temp file
MSG_LOG=/tmp/job_log
rm -f $MSG_LOG

# background job function
bg_job(){
    JOB=$1
    sleep $JOB
    echo $JOB "End" >> $MSG_LOG
}


JOB_LIST=(
    "5"
    "6"
    "3"
    "4"
)
# run all job
for FLASH in "${JOB_LIST[@]}" ; do 
    bg_job $FLASH &
done


# Waiting for the end of all the job
while [ "j$(jobs -r)" != "j" ] ; do
    sleep 1
done

# show job msg
cat $MSG_LOG
echo "<< bg_job all complete >>"

exit 0;
2011-01-20 13:49

[Windows 群組原則]中的設定

Windows 群組原則中的設定,雖然大部分都看不懂或者沒多大幫助,但是有些設定還蠻有用的。

開啟[群組原則]

開始/執行 -> gpedit.msc

電腦設定/系統管理範本/系統 -> 關閉自動播放
啟用這個設定可以讓隨身碟或光碟停用自動播放,避免被 autorun.inf 病毒攻擊,當然也關閉了那煩人的對話匡
電腦設定/系統管理範本/系統/指令碼 -> 非同步執行啟動指令碼
啟用這個設定可以讓開機載入軟體時稍微快一點,不用一個等一個的。
2011-01-19 16:38

[Regedit] Oracle 日期格式及語言編碼設定

上次用到時沒有記下來,結果忘記了,這次先把他記下來。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Oracle]
"NLS_LANG"="AMERICAN_AMERICA.UTF8"
"NLS_DATE_FORMAT"="YYYY-MM-DD HH24:MI:SS"

[HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ALL_HOMES\ID0]
"NLS_LANG"="AMERICAN_AMERICA.UTF8"
"NLS_DATE_FORMAT"="YYYY-MM-DD HH24:MI:SS"

[HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOME0]
"NLS_LANG"="AMERICAN_AMERICA.UTF8"
"NLS_DATE_FORMAT"="YYYY-MM-DD HH24:MI:SS"
2011-01-19 02:36

使用批次檔開關 Oracle 服務

因為在 NB 上灌了 Oracle 做開發用,可是每次開機都變得很慢,而且不是每天都會用到 Oracle,但常常開開關關服務真的很麻煩,索性找了一下批次檔開關服務的方法,寫了一個簡單的小工具,至少在處理這瑣碎的事可以快樂一點。

@echo off

set /p STATUS=Oracle Service status to [start/stop] : 

net %STATUS% "OracleMTSRecoveryService"
net %STATUS% "OracleOraHome92Agent"
net %STATUS% "OracleOraHome92TNSListener"
net %STATUS% "OracleServiceMYDB"

pause
2011-01-19 02:16

[Regedit] 在『我的電腦』右鍵加入系統功能選項

將下面的登錄碼複製到筆記本,檔名存成 options.reg 然後再執行檔案就可以了,如果有不要的功能將 "HKEY_LOCAL_MACHINE" 換成 "-HKEY_LOCAL_MACHINE" 就可以了。

Windows Registry Editor Version 5.00


[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Control]
@="控制台(&C)"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Control\command]
@="rundll32.exe shell32.dll,Control_RunDLL"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\DevMgr]
@="裝置管理員(&D)"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\DevMgr\command]
@="mmc.exe devmgmt.msc"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\DiskMgmt]
@="磁碟管理"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\DiskMgmt\command]
@="mmc.exe DiskMgmt.msc"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\EventVwr]
@="事件檢視器"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\EventVwr\command]
@="mmc.exe EventVwr.msc"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\FsMgmt]
@="共用資料夾"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\FsMgmt\command]
@="mmc.exe FsMgmt.msc"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\GroupEdit]
@="群組原則"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\GroupEdit\command]
@="mmc.exe gpedit.msc"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\LusrMgr]
@="本機使用者和群組"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\LusrMgr\command]
@="mmc.exe LusrMgr.msc"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\PerfMon]
@="效能"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\PerfMon\command]
@="mmc.exe PerfMon.msc"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Regedit]
@="登錄檔編輯器"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Regedit\command]
@="regedit"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Service]
@="服務(&F)"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Service\command]
@="mmc.exe services.msc"