最近朋友用shell写自动化测试脚本, 请求接口并处理一些逻辑。我写的也不多,只能边查边给他提供帮助。
以下就是这个过程形成的知识点【发现shell又强大,又弱小[笑哭]】
0、把数组转成字符串
本以为像其他语言,有现成的方法直接转换,比如PHP的implode(), Golang的strings.Join(strSlice, “,”)
结果发现Shell并没有,沮丧~
继续阅读
最近朋友用shell写自动化测试脚本, 请求接口并处理一些逻辑。我写的也不多,只能边查边给他提供帮助。
以下就是这个过程形成的知识点【发现shell又强大,又弱小[笑哭]】
0、把数组转成字符串
本以为像其他语言,有现成的方法直接转换,比如PHP的implode(), Golang的strings.Join(strSlice, “,”)
结果发现Shell并没有,沮丧~
继续阅读
一、查看进程,ps aux
ps aux | grep 'niliu' #以上命令想必你一定不陌生,那么如果想快速知道每行的含义呢 [root@Mcqp15t170 chuanbo7]# ps aux | grep 'USER' USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 5637 0.0 0.0 112640 960 pts/0 S+ 19:28 0:00 grep --color=auto USER 每一列参数说明 +---------+--------------------------------------------------------------------------------------------------------------------+ | name | info | +---------+--------------------------------------------------------------------------------------------------------------------+ | USER | 进程所有者用户名 | | PID | 进程标识符 | | %CPU | 该进程使用CPU百分比 | | %MEM | 该进程使用物理内存百分比 | | VSZ | 该进程使用的虚拟内存(KB) | | RSS | 该进程占有的固定内存(KB) | | TTY | 终端名称 | | STAT | 进程状态(具体状态含义参考下文进程状态) | | START | 进程开始执行时间(当天显示小时:分钟;一天之前显示月:日, 一年之前的还没有遇到过) | | TIME | 进程实际占有CPU总时间(i:s) | | COMMAND | 启动任务命令行包括参数 | +---------+--------------------------------------------------------------------------------------------------------------------+ # 其实ps aux就行了,但是如果进程太大,不方便查看 ps aux | grep 'filterfeeds' root 16803 8.6 0.3 368496 43760 ? S 17:37 4:27 /usr/local/sinasrv2/bin/php /data1/www/htdocs/energy.tv.weibo.cn/public/cli.php request_uri=/cli_filterfeeds/index/proc_total/8/proc_num/6 root 16870 18.6 0.4 383204 59104 ? R 17:37 9:37 /usr/local/sinasrv2/bin/php /data1/www/htdocs/energy.tv.weibo.cn/public/cli.php request_uri=/cli_filterfeeds/index/proc_total/8/proc_num/7
进程状态:
D 不可中断睡眠 (通常是在IO操作) 收到信号不唤醒和不可运行, 进程必须等待直到有中断发生 R 正在运行或可运行(在运行队列排队中) S 可中断睡眠 (休眠中, 受阻, 在等待某个条件的形成或接受到信号) T 已停止的 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行 W 正在换页(2.6.内核之前有效) X 死进程 (未开启) Z 僵尸进程 进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放BSD风格的 < 高优先级(not nice to other users) N 低优先级(nice to other users) L 页面锁定在内存(实时和定制的IO) s 一个信息头 l 多线程(使用 CLONE_THREAD,像NPTL的pthreads的那样) + 在前台进程组
shell中(version >= 4.1.2)也存在关联数组(associated array),跟PHP的关联数据很像。
查看shell版本
bash -version GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu) Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.
一个验证业务机与DB的联通性的小工具
#!/bin/bash # 请求全部业务机上操作DB的接口,测试联通性 ips=(47.75.217.22, 47.75.217.23, 47.75.217.24, 47.75.217.25, 47.75.217.26) if [ x$1 != x ]; then mod=$1 else mod="r" fi for ip in ${ips[@]}; do curl -x "$ip:80" "http://i.niliu.me/api/dbconn?cip=$ip&mod=$mod" echo "ok" done
做为开发同学,实际工作中熟练使用大部分shell命令就能完成绝大多数事情,需要编写shell脚本的场景(机会)并不多。一般不会系统去学习shell脚本,这就导致偶尔要写一个shell脚本,往往觉得很费劲,比如自动登陆服务器、分发文件…
实际上系统介绍shell脚本的资料很少(包括书籍和网络),没有找到官网,网上各种教程也是众说纷纭,特整理一份让开发很快能熟悉的文档。
Shell是一种脚本编程语言,类似PHP、Python。可以简洁地表达复杂的操作(用很少的代码实现强大的功能)。
继续阅读
简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。这里并不打算介绍awk,也不是简明教程,如果想看教程,推荐耗子的文章《AWK 简明教程》。
awk格式如下:
# 方式一: awk '{pattern + action}' {filenames} # 方式二: cat filename | awk ‘{print $1}’
常用内置变量
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
看了很多资料把cron和crontab混为一谈,这里从澄清概念开始。
0、什么是cron。
在Linux环境下,周期性执行一些任务,用cron。cron由crond守护进程和一组crontab文件(配置文件)组成。
crond守护进程随系统启动,每分钟读取检查一次crontab文件,并通过fock子进程执行满足条件的指令。
# 查看cron手册 man cron # 查看crond进程 ps -ef | grep 'crond' | grep -v 'grep'