X皮書之shell實戰開發


 
 
  最近正在忙於開發豆瓣數據同步,主要原因是豆瓣接口不給力,超過一定的訪問量就抓不到它的數據。所以決定把豆瓣的數據導入到本地服務器,然后使用我們自己的數據。
 
  導入數據的腳本我已經開發完了。現在就剩下命令行調用了。今天我就專門研究了下shell的應用,我把我的思考過程寫一下。
 
准備
 
 這是要使用的php測試腳本(並不是我的線上代碼,只是一個樣例)。
<?php
if ($_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/bash

WORK_DIR="/home/www/test/"
SCRIPT_NAME=index.php

function 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
    ;;
esac
exit 0

 

 

總結
 
  這就是我今天收獲的一些東西,shell我也不是很精通。如果大家有更好的建議,希望告知一、二。

 

推薦
 
 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM