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

 

推荐
 
 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux Shell高级技巧实战总结 一、将输入信息转换为大写字符后再进行条件判断 二、为调试信息设置输出级别 三、判断参数是否为数字 四、判断整数变量的奇偶性 五、将Shell命令赋值给指定变量,以保证脚本的移植性 六、获取当前时间距纪元时间(1970年1月1日)所经过的天数 七、非直接引用变量 八、在循环中使用管道的技巧 九、自链接脚本 十、Here文档的使用技巧 十一、获取进程的运行时长(单位: 分钟) 十二、模拟简单的top命令 十三、格式化输出指定用户的当前运行进程 十四、用脚本完成which命令的基本功能 十五、验证输入信息是否合法 十六、整数验证 十七、判断指定的年份是否为闰年 十八、将单列显示转换为多列显示 十九、将文件的输出格式化为指定的宽度 二十、监控指定目录下磁盘使用空间过大的用户 二十一、编写一个更具可读性的df命令输出脚本 二十二、编写一个用于添加新用户的脚本 二十三、kill指定用户或指定终端的用户进程 二十四、判断用户输入(是/否)的便捷方法 二十五、通过FTP下载指定的文件 二十六、文件锁定 二十七、用小文件覆盖整个磁盘 二十八、统计当前系统中不同运行状态的进程数量 二十九、浮点数验证 三十、统计英文文章中每个单词出现的频率 Linux Shell经典实例解析--Oracle启动脚本(上) Linux Shell经典实例解析--Oracle启动脚本(下)
Shell脚本高级编程教程,希望对你有所帮助。 Example 10-23. Using continue N in an actual task: 1 # Albert Reiner gives an example of how to use "continue N": 2 # --------------------------------------------------------- 3 4 # Suppose I have a large number of jobs that need to be run, with 5 #+ any data that is to be treated in files of a given name pattern in a 6 #+ directory. There are several machines that access this directory, and 7 #+ I want to distribute the work over these different boxen. Then I 8 #+ usually nohup something like the following on every box: 9 10 while true 11 do 12 for n in .iso.* 13 do 14 [ "$n" = ".iso.opts" ] && continue 15 beta=${n#.iso.} 16 [ -r .Iso.$beta ] && continue 17 [ -r .lock.$beta ] && sleep 10 && continue 18 lockfile -r0 .lock.$beta || continue 19 echo -n "$beta: " `date` 20 run-isotherm $beta 21 date 22 ls -alF .Iso.$beta 23 [ -r .Iso.$beta ] && rm -f .lock.$beta 24 continue 2 25 done 26 break 27 done 28 29 # The details, in particular the sleep N, are particular to my 30 #+ application, but the general pattern is: 31 32 while true 33 do 34 for job in {pattern} 35 do 36 {job already done or running} && continue 37 {mark job as running, do job, mark job as done} 38 continue 2 39 done 40 break # Or something like `sleep 600' to avoid termination. 41 done 42 43 # This way the script will stop only when there are no more jobs to do 44 #+ (including jobs that were added during runtime). Through the use 45 #+ of appropriate lockfiles it can be run on several machines 46 #+ concurrently without duplication of calculations [which run a couple 47 #+ of hours in my case, so I really want to avoid this]. Also, as search 48 #+ always starts again from the beginning, one can encode priorities in 49 #+ the file names. Of course, one could also do this without `continue 2', 50 #+ but then one would have to actually check whether or not some job 51 #+ was done (so that we should immediately look for the next job) or not 52 #+ (in which case we terminate or sleep for a long time before checking 53 #+ for a new job).

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值