Shell 相关技巧的总结应用(1)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

1、以指定用户的身份运行命令

  runuser - work -c "cd /home/work/uc/bin  && sh start.sh"

  runuser - push -c "cd /home/push/mucs/bin  && sh start.sh"

  或者:

  daemon --user mongod "mongod --config conf/mongod.conf"

  daemon 是一个函数名,在使用前需要 source /etc/rc.d/init.d/functions


2、关于rsync数据同步的相关应用:

  同步公司UC数据

  rsync -avzptogl --progress uc --exclude "uc/logs"  zayhu05-mb:/home/work/

  同步mucs数据

  rsync -avzpogtl --progress mucs --exclude "mucs/logs" --exclude "mucs/saved" --exclude "mucs/ttscache"  mucs06-fk:/home/push

  更换磁盘时 本地同步

  rsync -avztopgl --progress /data/    /data03/

  说明:如果没有-l参数,将不会同步soft link ;--exclude 可以排除一些不希望同步的子目录


3、防御方法新的挑战应答极限攻击:

  采用sysctl将挑战应答极限值提高到较大范围,使得攻击者不能合理地达到它,因此不能推断出客户服务器连接的任何附加数据,以此达到防御目的。

  1)设置 /etc/sysctl.conf 中的net.ipv4.tcp_challenge_ack_limit 到一个较大的值(如999999999):

net.ipv4.tcp_challenge_ack_limit = 999999999

  2)加载设置:

  sysctl -p


4、在umount 一块磁盘时,系统总是提示busy,排错如下:

[root@mucs03-mb ~]# lsof +D /data2/

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME

bash    6646 push  cwd    DIR 202,80     4096 3145731 /data2/mucs/logs

[root@mucs03-mb ~]# ps -ef | grep 6646

root      5866  1567  0 14:56 pts/1    00:00:00 grep --color=auto 6646

push      6646  6645  0 Nov23 pts/0    00:00:00 -bash

[root@mucs03-mb ~]# kill 6646

[root@mucs03-mb ~]# 然后再umount , 卸载成功

补充:如果/data2中包含swap分区的扩展文件,然后在没有swapoff的情况下,直接将文件move到其它磁盘,然后再查看/data2时系统会提示busy


5、统计公司应用 错误日志的分布比例:

[push@mucs01-fk logs]$  grep -i error mucs.err.log.2016-12-09 | awk -F'[\\[\\]]' '{state[$4]+=1;line+=1}END{for(i in state)printf ("%-35s%10d\t%-8f%\n",i,state[i],state[i]*100/line)}'

wKioL1hLg0nTx46qAAIxizXQwiA724.png-wh_50

注意:awk 在定义分隔符时可以定义多个,例如:df -h | awk -F"[ %]" '/data/{if($(NF-2)>50)print $0}'  就是以空格或百分号为分隔符;但如果分隔符需要定义成中括号时,就必须使用转义符。awk 转义中括号时需要使用 '\\' 。 


6、从/var/log/nginx/error.log文件中过滤近十分钟的error日志:

[root@nginx01-mb ~]# tail -c 10m  /var/log/nginx/error.log | grep -a "error" | awk -F '['  'BEGIN{"date +%s" | getline nowTS}{"date -d \""$1"\" +%s" | getline ts; if((nowTS - ts) < 600) print $0 }'

wKiom1hLj7CTUMKZAAG7MBZJRks548.png-wh_50

说明:首先从日志中取出最后10M的日志,然后过滤带有"error"的行;然后取当前时间戳,用getline将当前时候戳放入newTS变量;然后使用 date -d 将每行日志中的固定时间 转换成%s (时间戳)格式,并放入变量ts中;最后判断当前时间戳减去日志时间戳是否大于600s,并输出最终结果。


7、Shell函数返回值常用的两种方式:return,echo

1 return 语句
    
shell
函数的返回值,可以和其他语言的返回值一样,通过return语句返回

   注意:return只能用来返回整数值,且和c的区别是0返回为正确,其他的值为错误。

2echo 返回值

   其实在shell中,函数的返回值有一个非常安全的返回方式,即通过输出到标准输出返回。因为子进程会继承父进程的标准输出,因此,子进程的输出也就直接反应到父进程。一定要注意,不要向标准输出传送一些不是结果的信息(也就是说,不要随便echo一些不需要的信息),比如调试信息 (这些调度信息可以重定向到一个文件中解决),所以在使用类似grep 的命令时 要记得加上 >/dev/null 2>&1 来接收这些输出信息,避免这些命令的输出


8、公司升级jdk总结

[root@template-jp ~]# tar xfz jdk-9-ea+146_linux-x64_bin.tar.gz

[root@template-jp ~]# ls

  jdk-9   jdk-9-ea+146_linux-x64_bin.tar.gz

[root@template-jp ~]# cp -r jdk-9 /usr/java/

[root@template-jp ~]# cd /usr/java/

[root@template-jp java]# ll

total 16

lrwxrwxrwx 1 root root   16 Jan 19  2016 default -> /usr/java/latest

drwxr-xr-x 8 root root 4096 Jan 19  2016 jdk1.7.0_80

drwxr-xr-x 9 root root 4096 Nov  8 13:53 jdk1.8.0_112

drwxr-xr-x 9 root root 4096 Nov  7 16:48 jdk1.8.0_77

drwxr-xr-x 8 root root 4096 Dec  8 12:10 jdk-9

lrwxrwxrwx 1 root root   22 Nov  8 13:53 latest -> /usr/java/jdk1.8.0_112

[root@template-jp java]# rm latest -f

[root@template-jp java]# ln -s /usr/java/jdk-9 latest

[root@template-jp java]# ll

total 16

lrwxrwxrwx 1 root root   16 Jan 19  2016 default -> /usr/java/latest

drwxr-xr-x 8 root root 4096 Jan 19  2016 jdk1.7.0_80

drwxr-xr-x 9 root root 4096 Nov  8 13:53 jdk1.8.0_112

drwxr-xr-x 9 root root 4096 Nov  7 16:48 jdk1.8.0_77

drwxr-xr-x 8 root root 4096 Dec  8 12:10 jdk-9

lrwxrwxrwx 1 root root   15 Dec  8 12:10 latest -> /usr/java/jdk-9

[root@template-jp java]# java -version

java version "9-ea"

Java(TM) SE Runtime Environment (build 9-ea+146)

Java HotSpot(TM) 64-Bit Server VM (build 9-ea+146, mixed mode)

[root@template-jp java]# 如果此时查看到的当前版本不正确,需要使用alternatives设置当前版本指向latest

[root@template-jp java]# alternatives --config  java

There are 4 programs which provide 'java'.

  Selection    Command

-----------------------------------------------

   1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java

*  2           /usr/java/jdk1.8.0_91/jre/bin/java

 + 3           /usr/java/latest/bin/java

   4           /usr/java/jdk-9/bin/java

Enter to keep the current selection[+], or type selection number: 3

[root@template-jp java]# 

注意:在解压 jdk-9-ea+146_linux-x64_bin.tar.gz 文件时尽量避免 使用-C参数直接解压到/usr/java目录中,也尽量避免把解压后的 jdk-9 目录直接使用mv 命令移动到/usr/java 目录,以上两种操作方法会导致 /usr/java/jdk-9/ 目录下内容owner和group的异常,如下图所示:

wKiom1hLieSwpYU8AALLM8bL5-k757.png-wh_50


9、关于awk 引用shell 变量的应用

关于awk 调用shell变量的方法很多,个人习惯使用-v选项,如下所示:

[root@zayhu01-mb ~]# df -h | awk -v threshold=$threshold -F"[ %]" '/data/{if($(NF-2)>threshold)print $0}'

wKioL1hLjCeCj_m0AAEVeVp_Snc841.png-wh_50


10、关于php 的缓存技术

早期的php需要借助eAccelerate或Xcache相关软件实现opcode缓存,从而提高速度;针对PHP5.5等高级版本,编译时需要加上--enable-opcache参数,PHP就会自带opcode 缓存功能。相关配置如下:

[root@nginx01-mb ~]# vim /usr/local/php-5.5.20/php.ini

opcache.enable=1

zend_extension=/usr/local/php-5.5.20/lib/php/extensions/no-debug-non-zts-20121212/opcache.so

opcache.memory_consumption=128

opcache.interned_strings_buffer=8

opcache.max_accelerated_files=4000

opcache.revalidate_freq=60

opcache.fast_shutdown=1

opcache.enable_cli=1

[root@nginx01-mb ~]# service php-fpm restart


11、磁盘空间未释放

近期nginx03-fk总是提示磁盘已满,但已经把相关数据及log清除,系统还是提示磁盘已满。仔细查看发现删除文件后磁盘空间并未释放。解决方法:重启相关app ,例 service  nginx restart 










本文转自 meteor_hy 51CTO博客,原文链接:http://blog.51cto.com/caiyuanji/1881445,如需转载请自行联系原作者
相关实践学习
日志服务之数据清洗与入湖
本教程介绍如何使用日志服务接入NGINX模拟数据,通过数据加工对数据进行清洗并归档至OSS中进行存储。
目录
相关文章
|
9月前
|
Shell
Shell脚本开发:printf和test命令的实际应用
Shell printf 命令 当你使用Shell中的printf命令时,它可以帮助你格式化和输出文本。 打印简单文本 这将简单地打印字符串"Hello, World!",并在末尾添加一个换行符\n来换行。 printf "Hello, World!\n" Shell test 命令 当你使用Shell中的test命令时,它用于测试条件是否为真(True)。test命令通常用于Shell脚本中的条件判断,以便根据条件的结果执行不同的操作。
41 1
|
2月前
|
人工智能 Shell 程序员
[oeasy]python005_退出游乐场_重启游乐场_系统态shell_应用态_quit
[oeasy]python005_退出游乐场_重启游乐场_系统态shell_应用态_quit
31 0
|
19天前
|
Shell Linux
【linux】进程替换的应用|shell解释器的实现
【linux】进程替换的应用|shell解释器的实现
12 0
|
1月前
|
Shell 开发工具 Android开发
|
2月前
|
运维 监控 Shell
shell脚本的应用
Shell脚本广泛应用于自动化运维、任务调度、系统管理等领域。它们用于备份、安装、监控系统资源、创建用户、网络管理、软件构建、测试、数据处理、安装程序、批处理作业及故障恢复。通过编写脚本,可提升效率,减少错误,实现无人值守的自动化操作。
31 6
|
2月前
|
Shell Linux 开发者
【Shell 命令集合 文件管理】Linux 补丁文件应用命令 patch命令使用指南
【Shell 命令集合 文件管理】Linux 补丁文件应用命令 patch命令使用指南
64 0
|
12月前
|
Shell Linux Perl
shell脚本应用实战2
shell脚本应用实战2
52 0
shell脚本应用实战2
|
2月前
|
NoSQL Shell Redis
Docker【应用 02】借助Docker部署Redis集群(Docker网卡创建+6个Redis集群搭建shell脚本)
Docker【应用 02】借助Docker部署Redis集群(Docker网卡创建+6个Redis集群搭建shell脚本)
80 0
|
9月前
|
Shell
Shell编程:流程控制与高级应用的深入解析
Shell 流程控制 使用Shell编程时,流程控制是非常重要的,它允许你根据条件执行不同的命令或者控制程序的执行流程。Shell支持一些基本的流程控制结构,包括条件语句和循环语句。 1、条件语句 if语句 if [ 条件 ]; then # 如果条件为真执行的命令 elif [ 其他条件 ]; then # 如果其他条件为真执行的命令 else # 如果所有条件都不为真执行的命令 fi 示例: #!/bin/bash read -p "请输入一个数字: " num if [ $num -eq 0 ]; then echo "输入的数字是零" elif [ $n
71 1
|
10月前
|
Shell
shell脚本里的函数应用
shell脚本里的函数应该
40 3