#!/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 11:09
[Shell] backup mysql data by day (note)
2011-01-25 10:14
[Shell] 依據遠端清單進行目錄同步
這個任務的狀況是:
有些新的檔案會被加入,而舊的檔案會被移除,檔案的內容基本上是不會變動的,所以可透過檔名來進行同步。
檔案下載與錯誤處理:
這裡用 curl 來處理下載的問題,並且當發生錯誤時重試三次。
清單比較:
從遠端下載檔案清單與本地端的目錄進行比對,並處理刪除跟下載的動作。
有些新的檔案會被加入,而舊的檔案會被移除,檔案的內容基本上是不會變動的,所以可透過檔名來進行同步。
檔案下載與錯誤處理:
這裡用 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 上,然後有機個考量點:
建立 server 端的 package
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 群組原則]中的設定
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"
訂閱:
文章 (Atom)
