X皮書之shell實戰開發

來源:互聯網
上載者:User
 序   最近正在忙於開發豆瓣資料同步,主要原因是豆瓣介面不給力,超過一定的訪問量就抓不到它的資料。所以決定把豆瓣的資料匯入到本機伺服器,然後使用我們自己的資料。   匯入資料的指令碼我已經開發完了。現在就剩下命令列調用了。今天我就專門研究了下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我也不是很精通。如果大家有更好的建議,希望告知一、二。

 

推薦  

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.