zoukankan      html  css  js  c++  java
  • 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我也不是很精通。如果大家有更好的建议,希望告知一、二。

    推荐
     
     

     

     

    喜欢编程
  • 相关阅读:
    C++常见错误大全(转)
    在字符串中删除特定字符
    C++ const 的全面总结
    函数返回局部变量问题
    TerminateThread()结束一个线程会有什么结果?
    小刘同学的第五十五篇博文
    小刘同学的五十、五一、五二博文断更…
    小刘同学的第五十三篇博文
    小刘同学的第四十九篇博文
    小刘同学的第四十八篇博文
  • 原文地址:https://www.cnblogs.com/baochuan/p/2737723.html
Copyright © 2011-2022 走看看