存档

‘Shell’ 分类的存档

阿里云ECS程序开机启动失败原因及解决办法

2020年1月10日 没有评论
  1. 场景描述:
    • 程序a、b均部署在阿里云ecs上,需要开机启动。a需要获取ecs的ip地址,b有较多依赖项。
    • 将a、b启动脚本均配置在rc.local中
    • a存在获取不到ip地址的情况,b存在启动失败的情况
  2. 解决办法:
    • 不通过rc.local启动
    • 将a、b启动脚本配置在crontab中,前面加上@reboot即可:
      @reboot start_a.sh
    • 对于a,需要等待阿里云后台服务启动完成之后才运行。这个需要修改crond.service。如下,追加cloud-final.service即可
      cat /etc/systemd/system/multi-user.target.wants/crond.service
      
      [Unit]
      Description=Command Scheduler
      After=auditd.service systemd-user-sessions.service time-sync.target <span style="color: #0000ff;">cloud-final.service</span>
分类: Shell, 资料 标签: ,

shell脚本异步执行多任务并等待任务结束

2019年6月21日 没有评论

通常情况下,shell脚本中每条命令都是逐条按顺序执行的。如果想同时执行多条命令,并在所有命令完成后退出,这该如何实现?

我们可以在需要异步执行的命令后加&来实现后台运行,同时,使用wait来等待后台任务执行完成。

比如:

#!/bin/sh
i=0
while [ $i -lt 3 ];do
    long_time_task &
    let i++
done
wait
分类: Shell 标签:

Shell字符串分割与随机访问

2017年11月10日 没有评论

    Shell经常做的一项工作就是文本处理,通过组合grep、awk、sed等来实现查找、分割、替换、删除等操作。今天说一下对单行字符串的分割处理方法。先看代码:

_uas="Mozilla/5.0 (Linux; Android 5.1.1; Redmi Note 3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/535.19|Mozilla/5.0 (Linux; Android 4.4.4; 2014813) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/535.19|Linux; Android 6.0.1; SM-G9008W) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/535.19|Mozilla/5.0 (Linux; Android 5.0.2; Redmi Note 2) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/535.19"

#生成随机索引
_rand_index=$(expr $RANDOM % 4) 

#设置新的分隔符
OLD_IFS="$IFS"
IFS="|" 
#将UA字符串分割到_arr数组中
_arr=($_uas) 
IFS="$OLD_IFS"

#通过下标访问数组中的元素。
_ua=${_arr[$_rand_index]}

    _uas包含以竖线|分隔的4个安卓UA,我想要随机取其中的一个UA来用。这涉及到两点需求:生成一个随机索引,将字符串按照指定的分隔符来分隔。

    Shell生成随机数的方法可以如上面代码一样直接取系统环境变量$RANDOM也可以通过date +%s的方法获取当前的秒数,再和数组长度取模来实现。当然通过系统时间的方法获得的随机数有可能并不很随机,特别是在操作间隔很短的情况下。

    单行字符串分割可以通过awk来实现,然后分别打印各列的值。但是通过设置系统IFS的方法看起来更直接,能够直接通过($string_line)将元素保存在新的数组中,这样就可以以下标的方式来访问。

    Shell还是博大精深的,不常用不足以体会其便捷与强大。

分类: Shell, 开发 标签: ,

一个从MongoDB中导出给定日期范围内数据的shell脚本

2017年6月29日 没有评论

前几天介绍了使用mongoexport的使用方法,结合date命令的使用,这里给出一个完整的脚本,用来从MongoDB中导出某个日期范围内的数据,数据导出后从MongoDB中进行删除

#!/bin/sh
#d1, the beginning date, eg:2017-06-28
d1=$1 
d1=`date -d $d1 +%F`
 
#transfer d1 to seconds
d2=`date -d $d1 +%s`
#increase d1 by one day
d2=`expr $d2 + 86400`
#transfer d2 from seconds to day
d2=`date -d @$d2 +%F`

#build query json
qj='{"time":{$gte:ISODate("'"$d1"'T00:00:00Z")}, "time":{$lt:ISODate("'"$d2"'T00:00:00Z")}}'
#export
./mongoexport --db testDB --collection testColl --query="$qj" --fields="userId,userName" --type="csv" --out results"-$d1" --noHeaderLine

#generate js for delete
echo 'var db = connect("testDB");' > delete.js
echo 'db.testColl.remove({"time":{$gte:ISODate("'"$d1"'T00:00:00Z")}, "time":{$lt:ISODate("'"$d2"'T00:00:00Z")}})' >> delete.js
#delete 
./mongo delete.js

备注:如果MongoDB使用的不是默认端口27017,上面的脚本里mongoexport和mongo都需要增加–port参数,并且delete.js中的connect方法也需要指定端口,指定方式为:

var db = connect("127.0.0.1:port/testDB");
分类: MongoDB, Shell 标签: ,

shell中计算偏移日期的方法

2017年6月29日 没有评论

给定一个日期,如何在shell中计算前几天或者后几天的日期?

方法如下:

#给定当前日期
d1=`date +%F`

#计算两天后的日期
offset=2

 #d1转换成秒, since 1970-01-01 00:00:00 UTC
d1s=`date -d $d1 +%s`

#将偏移天数换算成秒数
offset_s=`expr 86400 \* $offset` 

#计算偏移后 的秒数
d2s=`expr $d1s + $offset_s`

#将偏移后的秒数转换成日期
d2=`date -d @$d2s + %F`

主要原理就是通过date -d +%s来实现日期和秒之间的互转,详情man date一下吧。

分类: Shell 标签: ,

wtail:可以多屏输出的多文件跟踪查看工具

2017年5月17日 没有评论

tail是我们常用到的文件跟踪查看工具,-n可以查看末尾n行,-f可以实时跟踪文件(描述符)的最新变化。当然也可以同时查看多个文件,但是多文件的输出是混杂在一起的,没那么直观。

现在好了,我们有了wtail。这是一个可以在同一个终端窗口中同时输出多个被跟踪文件数据的工具,每个文件可以在单独的小屏幕中输出,即一个窗口分屏输出。

  1. 安装
    • wtail依赖libncurses,某些机器上可能没有这个库,需要手动安装:

      wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.0.tar.gz

      tar xzvf ncurses-6.0.tar.gz && cd ncurses-6.0

      ./configure && make && make install

    • 下载wtail源码包,解压,make && make install
  2. 使用
    • wtail *.log
分类: Shell, 工具, 运维 标签: , ,