序 最近正在忙於開發豆瓣資料同步,主要原因是豆瓣介面不給力,超過一定的訪問量就抓不到它的資料。所以決定把豆瓣的資料匯入到本機伺服器,然後使用我們自己的資料。 匯入資料的指令碼我已經開發完了。現在就剩下命令列調用了。今天我就專門研究了下shell的應用,我把我的思考過程寫一下。 準備 這是要使用的php測試指令碼(並不是我的線上代碼,只是一個範例)。
<?phpif ($_SERVER['argc'] < 2) { echo "調用不正確!\n"; echo "調用方式:"; echo "php {$_SERVER['argv'][0]} { rsync_show | rsync_show_by_id 1231123 | rsync_douban }\n"; exit(-1);}function rsync_show() { echo "調用節目資料\n";}function rsync_show_by_id($id) { if(empty($id)){ echo "缺少參數...\n"; exit(-1); } echo "根據指定ID開始匯入節目資料\n";}function rsync_douban() { echo "調用豆瓣資料層\n";}foreach ($_SERVER['argv'] as $k => $v) { if($k == 0) continue; if($v == 'rsync_show_by_id'){ call_user_func($v, $_SERVER['argv'][2]); break; }else{ call_user_func($v); }}exit(0);
查看幾個調用結果
錯誤1
錯誤2
正確的調用方式
通過crontab -e設定個定時執行指令碼
shell 指令碼
1、開始使用shell指令碼編程
運行指令碼
2、添加一個停止指令碼
3、函數整理
shell 查漏補缺 兩大問題: 1、是不是再寫一個方法? 2、怎麼傳參啊?
第一個問題,直接用start方法就行了,沒必要再寫一個方法!——多寫一個方法是要付出代價的。
第二個問題怎麼解決,我忽然想到在我們安裝開源軟體的時候喜歡這麼用,如
所以我決定也使用類似的方法作為參數傳遞之用。
具體看我下面的方法調用啊!
運行指令碼
重點:
1、函數調用
start $2 # 這是函數 + 參數
函數中的 $1表示第一個參數!
2、字元截取
${1:2:2} 表示把$1這個變數裡的值從第2個(下標是從0開始的)下標開始,截取2個長度的字元。
ID=${1#--id=}表示從$1這個變數開頭刪除最近匹配--id=的子串。
放入crontab中
我在php的原始碼中的configure中發現了一個不錯的輸出字元的方法,與大家分享
最近發現指令碼一天執行完畢不了,這樣就產生多個指令碼在後台執行的問題,解決方案如下
運行效果
完整源碼
#!/bin/bashWORK_DIR="/home/www/test/"SCRIPT_NAME=index.phpfunction start() { if [ "$1" != "" ] && [ ${1:2:2} == "id" ] then ID=${1#--id=} echo "開始匯入ID為$ID的資料" nohup php $WORK_DIR/$SCRIPT_NAME rsync_show_by_id $ID & exit 0 fi pid=`ps aux | grep $SCRIPT_NAME | grep -v grep | awk '{print $2}'` if [ "$pid" != "" ] then echo "指令碼已經啟動..." exit 0 fi echo "開始匯入資料..." nohup php $WORK_DIR/$SCRIPT_NAME rsync_show rsync_douban &}function stop() { echo "結束匯入資料..." #pkill -9 -f index.php pid=`ps aux | grep $SCRIPT_NAME | grep -v grep | awk '{print $2}'` if [ "$pid" != "" ] then kill -9 $pid &>/dev/null fi }function restart() { stop start}case "$1" in start ) start $2 ;; stop ) stop ;; restart ) restart ;; * )cat <<_ACEOF 使用方法: $0 { start | stop | restart } 選項配置 $0 start --id=1003_ACEOF ;;esacexit 0
總結 這就是我今天收穫的一些東西,shell我也不是很精通。如果大家有更好的建議,希望告知一、二。
推薦