Linux/Unix
第一页 1 2 3 4 5 6 7 8 下页 最后页 [ 显示模式: 摘要 | 列表 ]

Linux 搜索文件中的字符串

[不指定 2017/12/27 06:07 | by 刘新修 ]
C#代码
  1. [root@sd-cnmo-lidandan-web1 www]# find -type f -name '*.php'|xargs grep 'Plugin_Header'  
Tags: ,

很多时候在使用Linux的shell时,我们都需要对文件名或目录名进行处理,通常的操作是由路径中提取出文件名,从路径中提取出目录名,提取文件后缀名等等。例如,从路径/dir1/dir2/file.txt中提取也文件名file.txt,提取出目录/dir1/dir2,提取出文件后缀txt等。

下面介绍两种常用的方法来进行相关的操作。

一、使用${}

1、${var##*/}

该命令的作用是去掉变量var从左边算起的最后一个'/'字符及其左边的内容,返回从左边算起的最后一个'/'(不含该字符)的右边的内容。使用例子及结果如下:

liuxinxiu@HongKong: var=/dir1/dir2/file.txt

liuxinxiu@HongKong: echo ${var##*/}

file.txt

从运行结果可以看到,使用该命令,可以提取出我们需要的文件名file.txt。

若使用时在shell程序文件中,可以使用变量来保存这个结果,再加以利用,如file=${var##*/}

2、${var##*.}

该命令的作用是去掉变量var从左边算起的最后一个'.'字符及其左边的内容,返回从左边算起的最后一个'.'(不含该字符)的右边的内容。使用例子及结果如下:

liuxinxiu@HongKong: var=/dir1/dir2/file.txt

liuxinxiu@HongKong: echo ${var##*.}

txt

从运行结果可以看到,使用该命令,可以提取出我们需要的文件后缀。

如果文件的后缀不仅有一个,例如,file.tar.gz,命令${var##*.}仅能提取最后一个后缀,而我想提取tar.gz时该怎么办?那么就要用下面所说的${var#*.}命令了。

3、${var#*.}

该命令的作用是去掉变量var从左边算起的第一个'.'字符及其左边的内容,返回从左边算起第一个'.'(不含该字符)的右边部分的内容。使用例子及结果如下:

liuxinxiu@HongKong: var=/dir1/dir2/file.tar.gz

liuxinxiu@HongKong: echo ${var#*.}

tar.gz

从运行结果可以看到,使用该命令,可以提取出文件的多个后缀。

4、${var%/*}

该命令的使用是去掉变量var从右边算起的第一个'/'字符及其右边的内容,返回从右边算起的第一个'/'(不含该字符)的左边的内容。使用例子及结果如下:

liuxinxiu@HongKong: var=/dir1/dir2/file.txt

liuxinxiu@HongKong: echo ${var%/*}

/dir1/dir2

从运行的结果可以看到,使用该命令,可以提取出我们需要的文件所在的目录

5、${var%%.*}

该命令的使用是去掉变量var从右边算起的最后一个'.'字符及其右边的内容,返回从右边算起的最后一个'.'(不含该字符)的左边的内容。使用例子及结果如下:

liuxinxiu@HongKong: var=/dir1/dir2/file.txt

liuxinxiu@HongKong: echo ${var%%.*}

/dir1/dir2/file

当我们需要建立一个与文件名相同名字(没有后缀)的目录与对应的文件相对应时,就可以使用该命令来进行操作。例如,解压文件的情况就与此类似,我们压缩文件file.zip时,会在与file.zip同级目录下建立一个名为file的目录。

6、${}总结

其实${}并不是专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操作,它可以提取非常多的内容,并不一定是上面五个例子中的'/'或'.'。也就是说,上面的使用方法只是它使用的一个特例。

看到上面的这些命令,可能会让人感到非常难以理解和记忆,其实不然,它们都是有规律的。

#:表示从左边算起第一个

%:表示从右边算起第一个

##:表示从左边算起最后一个

%%:表示从右边算起最后一个

换句话来说,#总是表示左边算起,%总是表示右边算起。

*:表示要删除的内容,对于#和##的情况,它位于指定的字符(例子中的'/'和'.')的左边,表于删除指定字符及其左边的内容;对于%和%%的情况,它位于指定的字符(例子中的'/'和'.')的右边,表示删除指定字符及其右边的内容。这里的'*'的位置不能互换,即不能把*号放在#或##的右边,反之亦然。

例如:${var%%x*}表示找出从右边算起最后一个字符x,并删除字符x及其右边的字符。

看到这里,就可以知道,其实该命令的用途非常广泛,上面只是指针文件名和目录名的命名特性来进行提取的一些特例而已。

二、basename和dirname

${}并不是专门为提取文件名和目录名设计的命令,那么basename和dirname命令就是专门为做这一件事而已准备的了。

1、basename

该命令的作用是从路径中提取出文件名,使用方法为basename NAME [SUFFIX]。

1)从路径中提出出文件名(带后缀),例子如下:

liuxinxiu@HongKong: var=/dir1/dir2/file.txt

liuxinxiu@HongKong: echo (basename $var)

file.txt

2)从上面命令的用法中可以看到,后缀(SUFFIX)是一个可选项。所以,若只想提取出文件名file,而不带有后缀,还可以在变量的后面加上后缀名,例子如下:

liuxinxiu@HongKong: var=/dir1/dir2/file.txt

liuxinxiu@HongKong: echo (basename $var .txt)

file

2、dirname

该命令的作用是从路径中提取出目录名,使用方法为 dirname NAME

使用例子如下:

liuxinxiu@HongKong: var=/dir1/dir2/file.txt

liuxinxiu@HongKong: dirname $var

/dir1/dir2

这样就提取出了file.txt文件所在的目录。

注:该命令不仅能提取出普通文件所的目录,它能提取出任何文件所在的目录,例如目录所在的目录,如下:

liuxinxiu@HongKong: var=/dir1/dir2/

liuxinxiu@HongKong: dirname $var

/dir1

它提取出了目录dir2所在的目录dir1.

 

C#代码
  1. #!/bin/bash  
  2. if [ ! -n "$1" ] ;then  
  3.         echo "Error: you have not input a word!"  
  4.         ##### if [ $1 == "start" ] #######  
  5. elif [ $# -lt 2 ] ; then  
  6.         echo "Error: number of parameters!"  
  7. else  
  8.         #echo "Error: the word you input is $1"  
  9.         if [[ ! -d "$1" ]]; then    
  10.                 mkdir "$1"  
  11.                 echo "Error: Directory does not exist $1"  
  12.         elif [[ ! -d "$2" ]]; then  
  13.                 mkdir "$1"  
  14.                 echo "Error: Directory does not exist $2"  
  15.         else  
  16.                 echo -e "=============== [www.cnmo.com] ================"  
  17.                 ##### SubmitTime #######  
  18.                 if [ ! -n "$3" ] ;then  
  19.                     #echo "you have not input a word!"  
  20.                     svntime=''  
  21.                 else  
  22.                     #echo "the word you input is $1"  
  23.                     minx=$[ $3 * 60 ]  
  24.                     #seldate=`-mtime $minx`  
  25.                     seldate='-mmin -'$minx  
  26.                 fi  
  27.                 #find $1 -type f -mtime 0 \( -name '*css' -or -name '*js' \) -printf "%P\n" | while read file #按时间  
  28.                 find $1 -type f $seldate \( -name '*css' -or -name '*js' \) -printf "%P\n" | while read file #按全部  
  29.                 do  
  30.                         ##### mkdir path #######  
  31.                         npath=${file%/*}  
  32.                         if [[ ! -d "$npath" ]]; then  
  33.                                 mkdir -p "$npath"  
  34.                         fi  
  35.                         #strA="helloworld"  
  36.                         #strB="tpl"  
  37.                         #if [[ $file =~ $strB ]]  
  38.                         #then  
  39.                         #  echo "包含"  
  40.                         #else  
  41.                         #  echo "不包含"  
  42.                         #fi  
  43.   
  44.                         if [[ $file =~ "tpl" ]]  
  45.                         then  
  46.                           echo "目录: "$file" 包含/tpl/直接略过.."  
  47.                         else  
  48.                                 ##### start yui #######  
  49.                                 dfile=$1"/"$file  
  50.                                 nfile=$2"/"$file  
  51.                                 yjar=/jar/yuicompressor-2.4.7.jar  
  52.                                 if [ "${file##*.}" = "css" ]; then  
  53.                                         java -jar $yjar --type css --charset gb2312 $dfile -o $nfile  
  54.                                         echo -e "ok[==>css]:"$nfile  
  55.                                 elif [ "${file##*.}" = "js" ]; then  
  56.                                         java -jar $yjar --type js --charset gb2312 $dfile -o $nfile  
  57.                                         #java -jar /jar/yuicompressor-2.4.2.jar --type js --charset gb2312 /data/svnroot/jenkins_SVN_data/old/origin/touch/315j.js -o /test/origin/touch/315j.js  
  58.                                         echo -e "ok[==>js]:"$nfile  
  59.                                 fi  
  60.                         fi  
  61.                 done  
  62.         fi  
  63. fi  
C#代码
  1. java -jar /jar/yuicompressor-2.4.2.jar --type js --charset gb2312 /data/svnroot/jenkins_SVN_data/old/origin/touch/315j.js -o /test/origin/touch/315j.js  
find / -amin -10 # 查找在系统中最后10分钟访问的文件
find / -atime -2 # 查找在系统中最后48小时访问的文件

find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件
find / -mtime -1 #查找在系统中最后24小时里修改过的文件

查看网络连接数:

netstat -an |wc -l

netstat -an |grep xx |wc -l        查看某个/特定ip的连接数

netstat -an |grep TIME_WAIT|wc -l    查看连接数等待time_wait状态连接数

netstat -an |grep ESTABLISHED |wc -l    查看建立稳定连接数量

 

查看不同状态的连接数数量

[root@cp-nginx ~]# netstat -an | awk '/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}'

LISTEN 8

ESTABLISHED 2400

FIN_WAIT1 2

TIME_WAIT 6000

 

查看每个ip跟服务器建立的连接数

[root@cp-nginx ~]# netstat -nat|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn

31 45.116.147.178

20 45.116.147.186

12 23.234.45.34

11 103.56.195.17

(PS:正则解析:显示第5列,-F : 以:分割,显示列,sort 排序,uniq -c统计排序过程中的重复行,sort -rn 按纯数字进行逆序排序)

 

查看每个ip建立的ESTABLISHED/TIME_OUT状态的连接数

[root@cp-nginx ~]# netstat -nat|grep ESTABLISHED|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn

24 103.56.195.17

19 45.116.147.186

18 103.56.195.18

17 45.116.147.178

 

 

问题1:解决time_wait连接数大量问题

查询到time_wait连接数过多情况下,调整内核参数:/etc/sysctl.conf

vim /etc/sysctl.conf

 

添加以下配置文件:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 300

 

/sbin/sysctl -p 让参数生效,调优完成

 

参数详解:

1.net.ipv4.tcp_syncookies = 1 表示开启 syn cookies 。当出现 syn 等待队列溢出时,启用 cookies 来处理,可防范少量 syn 攻击,默认为 0 ,表示关闭;

2.net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将 time-wait sockets 重新用于新的 tcp 连接,默认为 0 ,表示关闭;
3.net.ipv4.tcp_tw_recycle = 1 表示开启 tcp 连接中 time-wait sockets 的快速回收,默认为 0 ,表示关闭。
4.net.ipv4.tcp_fin_timeout 修改系靳默认的 timeout 时间


 

如果以上配置调优后性能还不理想,可继续修改一下配置:

vi /etc/sysctl.conf

C#代码
  1. net.ipv4.tcp_keepalive_time = 1200 #表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。  
  2.   
  3. net.ipv4.ip_local_port_range = 1024 65000 #表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。  
  4.   
  5. net.ipv4.tcp_max_syn_backlog = 8192 #表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。  
  6.   
  7. net.ipv4.tcp_max_tw_buckets = 5000 #表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。  
  8. 默认为180000,改为5000。  
  9. 对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于 Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。  


问题2:ESTABLISHED连接数过大问题

 

怎么解决请求结束后依然存在大量ESTABLISHED没有被释放

初步推断tomcat服务器回收session时出了问题,这个一般都跟服务器的Timeout设置有联系。

查看tomcat的配置文件 server.xml

<Connector port="8080" protocol="HTTP/1.1"                connectionTimeout="20000"                redirectPort="8443" URIEncoding="UTF-8" />
*****

 

检查配置得出20000毫秒的时候acceptCount=”100” ,明显不合理,最大连接数也太小了吧。

所以进一步优化:

connectionTimeout="20000" 改为 connectionTimeout="100"acceptCount="100"改为acceptCount="5000"

优化完毕,继续压测...

系统响应能力节节攀升,之前LoadRunner报错问题直到压倒***并发也再也没有出现。

Action.c(380): 错误 -26608: 对于“http://www.cnlogs.com/javame”,HTTP 状态代码=504 (Gateway Time-out)
 
Linux使用netstat命令查看并发连接数?
 
我们的网站部署在linux的服务器上,特别是web服务器,我们可能有时候做为运维人员,肯定是要查看网站的并发连接数是不是达到瓶颈等,所以在linux下,我们如何查看服务器的并发连接数呢?使用以下命令即可分组查看各种连接状态哦:
 
C#代码
  1. netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'  
解释:  返回结果示例:  LAST_ACK 5   (正在等待处理的请求数)  SYN_RECV 30  ESTABLISHED 1597 (正常数据传输状态)  FIN_WAIT1 51  FIN_WAIT2 504  TIME_WAIT 1057 (处理完毕,等待超时结束的请求数)    状态:描述  CLOSED:无连接是活动的或正在进行  LISTEN:服务器在等待进入呼叫  SYN_RECV:一个连接请求已经到达,等待确认  SYN_SENT:应用已经开始,打开一个连接  ESTABLISHED:正常数据传输状态  FIN_WAIT1:应用说它已经完成  FIN_WAIT2:另一边已同意释放  ITMED_WAIT:等待所有分组死掉  CLOSING:两边同时尝试关闭  TIME_WAIT:另一边已初始化一个释放  LAST_ACK:等待所有分组死掉  使用这上面的命令是可以查看服务器的种连接状态,其中ESTABLISHED 就是并发连接状态的显示数的了。如果你不想查看到这么多连接状态,而仅仅只是想查看并发连接数,可以简化一下命令,即: 
C#代码
  1. netstat -nat|grep ESTABLISHED|wc -l  
  2. 1164  

这个返回的数字就是当前并发的连接数的了。

nginx日志统计分析

[不指定 2017/10/18 23:13 | by 刘新修 ]

 本文主要使用的是grep,awk,cut等工具来对nginx日志进行统计和分析,具体如下:

 

1,列出当天访问最多次数的ip地址

cut -d- -f 1 /usr/local/nginx/logs/20160329/access_2016032913.log |uniq -c | sort -rn | head -20 

 

C#代码
  1. [root@httpservera 20160329]# cut -d- -f 1 /usr/local/nginx/logs/20160329/access_2016032913.log |uniq -c | sort -rn | head -20    
  2.      69 180.116.214.31   
  3.      45 180.116.214.31   
  4.      45 180.116.214.31   
  5.      36 49.80.54.111   
  6.      35 183.206.185.204   
  7.      35 180.116.214.31   
  8.      32 49.80.54.111   
  9.      32 49.80.54.111   
  10.      32 180.116.214.31   
  11.      31 117.136.45.101   
  12.      29 180.116.214.31   
  13.      28 218.205.19.112   
  14.      28 180.116.214.31   
  15.      28 180.116.214.31   
  16.      27 49.80.54.111   
  17.      27 222.185.248.242   
  18.      24 49.80.54.111   
  19.      24 175.0.8.161   
  20.      23 49.80.54.111   
  21.      23 49.80.54.111  

 2,查看某一个页面被访问的次数

[root@httpservera 20160329]#grep "/index.php" log_file | wc -l

 

3,查看每一个IP访问了多少页面并排序

awk '{++S[$1]} END {for (a in S) print a,S[a]}' access_2016032913.log |uniq|sort -rn|more

C#代码
  1. [root@httpservera 20160329]# awk '{++S[$1]} END {for (a in S) print a,S[a]}' access_2016032913.log |uniq|sort -rn|more  
  2. 223.94.229.51 148  
  3. 223.73.166.191 1  
  4. 223.68.252.103 156  
  5. 223.68.167.66 2  
  6. 223.68.106.138 43  
  7. 223.67.99.72 7  
  8. 223.67.153.173 12  
  9. 223.66.93.152 15  
  10. 223.66.38.31 103  
  11. 223.65.191.181 1  
  12. 223.65.191.135 11  
  13. 223.65.190.71 13  
  14. 223.65.141.78 3  
  15. 223.64.63.71 31  
  16. 223.64.63.229 7  
  17. 223.64.62.242 59  
  18. 223.64.62.23 27  
  19. 223.64.62.216 1  
  20. 223.64.62.160 40  
  21. 223.64.61.136 28  
  22. 223.64.60.80 13  
  23. 223.64.60.21 12  
  24. 223.64.237.37 187  
  25. 223.64.209.247 2  
  26. 223.64.158.4 15  

其中,sort -rn 按照数字从大到小排序,uniq 将重复行去除。

 

4,查看某一个ip访问了那些页面:grep ^xx.xx.xx.xx log_file |awk '{print $1,$7}'

C#代码
  1. [root@httpservera 20160329]# grep ^223.147.39.194 17 access_2016032913.log |awk '{print $1,$7}'          grep: 17: No such file or directory  
  2. access_2016032913.log:223.147.39.194 //customer/customerInfo/getCustUnReadMsgInfo.json  
  3. access_2016032913.log:223.147.39.194 //customer/customerInfo/getCustUnReadMsgInfo.json  
  4. access_2016032913.log:223.147.39.194 //remind/redDot/checkRedDot.json  
  5. access_2016032913.log:223.147.39.194 //remind/redDot/checkRedDot.json  
  6. access_2016032913.log:223.147.39.194 //thirdpartyapi/appaction/app_action/action_send_batch.json  
  7. access_2016032913.log:223.147.39.194 //customer/customerInfo/getCustUnReadMsgInfo.json  
  8. access_2016032913.log:223.147.39.194 //customer/customerInfo/getCustUnReadMsgInfo.json  
  9. access_2016032913.log:223.147.39.194 //remind/redDot/checkRedDot.json  
  10. access_2016032913.log:223.147.39.194 //remind/redDot/checkRedDot.json  
  11. access_2016032913.log:223.147.39.194 //customer/customerInfo/getCustUnReadMsgInfo.json  
  12. access_2016032913.log:223.147.39.194 //customer/customerInfo/getCustUnReadMsgInfo.json  
  13. access_2016032913.log:223.147.39.194 //remind/redDot/checkRedDot.json  
  14. access_2016032913.log:223.147.39.194 //remind/redDot/checkRedDot.json  
  15. access_2016032913.log:223.147.39.194 //customer/customerInfo/getCustUnReadMsgInfo.json  
  16. access_2016032913.log:223.147.39.194 //customer/customerInfo/getCustUnReadMsgInfo.json  
  17. access_2016032913.log:223.147.39.194 //remind/redDot/checkRedDot.json  
  18. access_2016032913.log:223.147.39.194 //remind/redDot/checkRedDot.json  

5,去掉搜索引擎统计当天的页面:awk '{print $12,$1}' access_2016032913.log | grep ^\"Mozilla | awk '{print $2}' |sort | uniq | wc -l    

C#代码
  1. [root@httpservera 20160329]# awk '{print $12,$1}' access_2016032913.log | grep ^\"Mozilla | awk '{print $2}' |sort | uniq | wc -l        
  2. 35  

6,查看一个小时内有多少ip访问:

C#代码
  1. [root@httpservera 20160329]# awk '{print $4,$1}' access_2016032913.log | grep 29/Mar/2016:13 | awk '{print $2}'| sort | uniq | wc -l     
  2. 1926  

2.访问量统计

 

1.根据访问IP统计UV

awk '{print $1}'  access.log|sort | uniq -c |wc -l

 

2.统计访问URL统计PV

awk '{print $7}' access.log|wc -l

 

3.查询访问最频繁的URL

awk '{print $7}' access.log|sort | uniq -c |sort -n -k 1 -r|more

 

4.查询访问最频繁的IP

awk '{print $1}' access.log|sort | uniq -c |sort -n -k 1 -r|more

 

5.根据时间段统计查看日志

 cat  access.log| sed -n '/14\/Mar\/2015:21/,/14\/Mar\/2015:22/p'|more

C#代码
  1. 1.根据访问IP统计UV  
  2. awk '{print $1}'  access.log|sort | uniq -c |wc -l  
  3. 2.统计访问URL统计PV  
  4. awk '{print $7}' access.log|wc -l  
  5. 3.查询访问最频繁的URL  
  6. awk '{print $7}' access.log|sort | uniq -c |sort -n -k 1 -r|more  
  7. 4.查询访问最频繁的IP  
  8. awk '{print $1}' access.log|sort | uniq -c |sort -n -k 1 -r|more  
  9. 5.根据时间段统计查看日志  
  10.  cat  access.log| sed -n '/14\/Mar\/2015:21/,/14\/Mar\/2015:22/p'|more  

备注:nginx 日志分割脚本

 

C#代码
  1. [root@iZ237lzm354Z logs]# vim  /opt/shell/nginx_log.sh  
  2. #! /bin/bash  
  3. #Power by guojinbao  
  4. date=`date +%Y-%m-%d-%H-%M-%S`  
  5. logfile="/guojinbao/nginx/logs/access.log"  
  6. logdir=/guojinbao/nginx/logs  
  7. pid=`cat /usr/local/nginx/logs/nginx.pid`  
  8. if [ ! -d $logdir ]; then  
  9.     mkdir -p $logdir  
  10. fi  
  11. /bin/mv $logfile $logdir/access_${date}.log  
  12. kill -HUP $pid  

crontab文件的一些例子

[不指定 2017/09/14 13:35 | by 刘新修 ]
30 21 * * * /usr/local/etc/rc.d/apache restart
#每晚的21:30 重启apache
 
45 4 1,10,22 * * /usr/local/etc/rc.d/apache restart
#每月1、10、22日的4 : 45重启apache
 
10 1 * * 6,0 /usr/local/etc/rc.d/apache restart
#每周六、周日的1 : 10重启apache
 
0,30 18-23 * * * /usr/local/etc/rc.d/apache restart
#每天18 : 00至23 : 00之间每隔30分钟重启apache
 
0 23 * * 6 /usr/local/etc/rc.d/apache restart
#每星期六的11 : 00 pm重启apache
 
* 23-7/1 * * * /usr/local/etc/rc.d/apache restart
#晚上11点到早上7点之间,每隔一小时重启  apache
 
* */1 * * * /usr/local/etc/rc.d/apache restart
#每一小时重启apache
 
0 11 4 * mon-wed /usr/local/etc/rc.d/apache restart
#每月的4号与每周一到周三的11点重启apache
 
0 4 1 jan * /usr/local/etc/rc.d/apache restart
#一月一号的4点重启apache
 
*/30 * * * * /usr/sbin/ntpdate 210.72.145.44
#每半小时同步一下时间
 
0 */2 * * * www /usr/bin/somecommand  >>  /dev/null 2>&1 #以用户www的身份每两小时就运行某个程序:
 
字段,可视需要决定。对于不指定的字段,要用“*”来填补其位置。
举例如下:
5 * * * * ls
指定每小时的第5分钟执行一次ls命令
 
30 5 * * * ls
指定每天的 5:30 执行ls命令
 
30 7 8 * * ls
指定每月8号的7:30分执行ls命令
 
30 5 8 6 * ls
指定每年的6月8日5:30执行ls命令
 
30 6 * * 0 ls
指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1,
 
以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]
 
30 3 10,20 * * ls
每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段]
 
25 8-11 * * * ls
每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段]
 
*/15 * * * * ls
每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]
 
30 6 */10 * * ls
每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls 命令]
 
50 7 * * * root run-parts /etc/cron.daily
每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件
[注:run-parts参数表示,执行后面目录中的所有可执行文件]

Mac 修改截图保存路径

[不指定 2017/09/14 11:35 | by 刘新修 ]

终端执行:

CSS代码
  1. defaults write com.apple.screencapture location ~/Desktop/screenshot  

有需要复制指令:

C#代码
  1. killall SystemUIServe  

这样,以后你的屏幕截图就会存储到你指定的文件夹中了:

/Users/jesse/Desktop/Screenshot

可设置软链接:

ln -s /Users/jesse/Desktop/Screenshot /mine/Screenshot

截图全屏:cmd+shift+3

截图局部:cmd+shift+4

buff/cache 内容释放

[不指定 2017/09/14 11:02 | by 刘新修 ]

实验环境 CentOS Linux release 7.3.1611 (Core)  3.10.0-514.6.1.el7.x86_64

oscache远程服务器特别卡,top命令查看获得 buff/cache 占据内存特别大,使用以下命令清理缓存:

swap清理:

swapoff -a && swapon -a

注意:这样清理有个前提条件,空闲的内存必须比已经使用的swap空间大

cache清理:

sync; sync; sync;&& echo 3 > /proc/sys/vm/drop_caches

sleep 2

echo 0 >/proc/sys/vm/drop_caches

To free pagecache:

echo 1 >/proc/sys/vm/drop_caches

To free dentries and inodes:

echo 2 >/proc/sys/vm/drop_caches

To free pagecache,dentries and inodes:

echo 3 >/proc/sys/vm/drop_caches

 

/proc/sys/vm/drop_caches 的值默认为0(所以我们清空后,还再恢复它的值为0)

一、概念介绍
linux系统中通常使用free命令来查看内存使用情况,free命令主要是从/proc/meminfo文件中读取的内存数据然后进行简单处理进行展示,根据查看free命令的手册了解到各个字段的含义。
total:系统总内存大小(分物理内存mem、交换分区swap)
used:已使用的内存(total - free - buffers - cache)
free:未使用的内存
shared:通常情况下是tmpfs(内存文件系统)使用的内存
buffers:内核缓冲区使用的内存
cache:page cache和slab所占用的内存之和
buff/cache:buffers + cache
available:在不进行swap的前提下还有多少内存可用于创建新的进程。这个跟free、buff/cache字段中的数字有所不同,这里的剩余内存是free加上可以被回收(有些slab、cache正在使用,不能回收)的page cache、mem slab的值的总和。
上述的page cache是系统读写磁盘文件时为了提高性能而将一部分文件缓存到内存中。这种做法虽然提高了磁盘I/O性能,但是也极大的占用了物理内存,特别当系统内存紧张时更容易出现问题。
 
二、实际用途
linux系统会经常执行一些写日志、生成备份文件的工作,当这些文件比较大时相应的cache就会占用大量的系统内存,而且这些类型的cache并不会被经常访问,所以系统会定期将这些cache flush到磁盘中。但是如果系统未及时的将这些cache flush到磁盘中的话,就会占用大量的内存导致出现swap的情况,这样会很影响系统的整体性能。
/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。有一个内核配置接口 /proc/sys/vm/drop_caches 可以允许用户手动清理cache来达到释放内存的作用,这个文件有三个值:1、2、3。具体介绍如下
Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.
- To free pagecache:
- * echo 1 > /proc/sys/vm/drop_caches
 
- To free dentries and inodes:
- * echo 2 > /proc/sys/vm/drop_caches
 
- To free pagecache, dentries and inodes:
- * echo 3 > /proc/sys/vm/drop_caches
 
- As this is a non-destructive operation, and dirty objects are notfreeable, the user should run "sync" first in order to make sure allcached objects are freed.
- This tunable was added in 2.6.16.
根据上面介绍,在执行上述命令需要先执行sync命令将page cache刷新到磁盘中,然后在通过该drop_caches接口进行缓存清理。
 
另外,在编写处理大文件的代码时,避免整个文件全部读取到内存中,这样会导致占用大量的内存,极端情况下会出现linux 系统的OOM导致的正常进程被终止。尽量将文件分割成小文件再进行处理,文件使用完毕后尽早close。
 
 
下面是我写的一个内存释放的脚本,分享给大家:
# vim /root/satools/freemem.sh
C#代码
  1. #!/bin/bash  
  2.   
  3. used=`free -m | awk 'NR==2' | awk '{print $3}'`  
  4. free=`free -m | awk 'NR==2' | awk '{print $4}'`  
  5.   
  6. echo "===========================" >> /var/log/mem.log  
  7. date >> /var/log/mem.log  
  8. echo "Memory usage | [Use:${used}MB][Free:${free}MB]" >> /var/log/mem.log  
  9.   
  10. if [ $free -le 100 ] ; then  
  11.                 sync && echo 1 > /proc/sys/vm/drop_caches  
  12.                 sync && echo 2 > /proc/sys/vm/drop_caches  
  13.                 sync && echo 3 > /proc/sys/vm/drop_caches  
  14.                 echo "OK" >> /var/log/mem.log  
  15. else  
  16.                 echo "Not required" >> /var/log/mem.log  
  17. fi
[root@Hongkong log]# vi mem.log
[root@Hongkong log]# chmod +x /etc/sh/freemem.sh
[root@Hongkong log]# pwd
/var/log
[root@Hongkong log]# chmod +x /etc/sh/freemem.sh
[root@Hongkong log]# cat /var/log/cron
 
查看定时任务执行的日志
/var/log/cron

查看定时任务是否开启
systemctl status crond.service
 
如果没有就安装:
yum install vixie-cron
yum install crontabs
 
/bin/systemctl restart crond.service  #启动服务
/bin/systemctl reload  crond.service  #重新载入配置
/bin/systemctl enable crond.service #加入开机服务列表
/bin/systemctl status  crond.service  #查看crontab服务状态
 
关闭并禁用默认防火墙:
systemctl status firewalld.service
systemctl stop firewalld.service
systemctl disable firewalld.service
 
手动开启一些服务:
systemctl start docker.service
systemctl start crond.service
 
开机自动开启默认服务:
systemctl enable nginx.service
systemctl enable httpd.service
systemctl enable docker.service
systemctl enable crond.service
 
 

安装crontab:

1
yum install crontabs

说明:

1
2
3
4
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
1
2
查看crontab服务状态:service crond status
手动启动crontab服务:service crond start

查看crontab服务是否已设置为开机启动,执行命令:ntsysv

加入开机自动启动:

1
chkconfig crond on
 
 
 
将脚本添加到crond任务,定时执行。
# echo "*/59 * * * * root /root/satools/freemem.sh" >> /etc/crondtab (59分钟执行一次)
# echo "2 8-20/6 * * * root /root/satools/freemem.sh" >> /etc/crondtab (8-20时的2分,每隔6个小时执行一次)

google chrome 插件安装目录

[不指定 2017/06/19 13:52 | by 刘新修 ]

MAC:

C#代码
  1. /Users/jesse/Library/Application Support/Google/Chrome/Default/Extensions/nhdogjmejiglipccpnnnanhbledajbpd/0.0.2_0  

windows:

C#代码
  1. C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\Default\Extensions\nhdogjmejiglipccpnnnanhbledajbpd\3.1.4_0  

 

/bin/false和/sbin/nologin的区别
 
1 区别 
/bin/false是最严格的禁止login选项,一切服务都不能用。 
/sbin/nologin只是不允许login系统 
 
其中树莓派的/sbin/nologin文件在/usr/sbin/nologin 
小技巧: 
查看 /etc/passwd文件,能看到各用户使用的shell 
 
2.1 nologin 
当用户配置成/sbin/nologin时,如果再使用该用户ssh到linux操作系统,会提示 
This account is currently not available. 
 
如果在树莓派下,配置错误,误将/usr/sbin/nologin配置成/sbin/nologin,SSH时会提示 
root@raspberrypi:/home# useradd -s /sbin/nologin piaohailin 
root@raspberrypi:/home# su piaohailin 
Cannot execute /sbin/nologin: No such file or directory 
 
2.2 false 
当用户配置成/bin/false时,ssh之后显示如下 
root@raspberrypi:/home# useradd -s /bin/false piaohailin 
root@raspberrypi:/home# su piaohailin 
root@raspberrypi:/home# whoami 
root 

不会有任何提示,用户切换不过去 

第一页 1 2 3 4 5 6 7 8 下页 最后页 [ 显示模式: 摘要 | 列表 ]