Centos Shell编程入门

从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一。

Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种 就足够了。在本文中,我们关注的重点是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用;同时,Bash也是大多数Linux系统默认的Shell。在一般情况下,人们并不区分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我们可以看到#!/bin/sh,它同样也可以改为#!/bin/bash。

利用vi等文本编辑器编写Shell脚本的格式是固定的,如下:

#!/bin/sh

#comments

Your commands go here

首行中的符号#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程 序。如果首行没有这句话,在执行脚本文件的时候,将会出现错误。后续的部分就是主程序,Shell脚本像高级语言一样,也有变量赋值,也有控制语句。除第 一行外,以#开头的行就是注释行,直到此行的结束。如果一行未完成,可以在行尾加上",这个符号表明下一行与此行会合并为同一行。

编辑完毕,将脚本存盘为filename.sh,文件名后缀sh表明这是一个Bash脚本文件。执行脚本的时候,要先将脚本文件的属性改为可执行的:

chmod +x filename.sh

执行脚本的方法是:

./filename.sh

下面我们从经典的“hello world”入手,看一看最简单的Shell脚本的模样。

#!/bin/sh

#print hello world in the console window

a = "hello world"

echo $a

Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型。新的变量会在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进 程都不能访问本地变量。这些变量与环境变量不同,环境变量被存储在另一内存区,叫做用户环境区,这块内存中的变量可以被子进程访问。变量赋值的方式是:

variable_name = variable_value

如果对一个已经有值的变量赋值,新值将取代旧值。取值的时候要在变量名前加$,$variable_name可以在引号中使用,这一点和其他高级语言是明显不同的。如果出现混淆的情况,可以使用花括号来区分,例如:

echo "Hi, $as"

就不会输出“Hi, hello worlds”,而是输出“Hi,”。这是因为Shell把$as当成一个变量,而$as未被赋值,其值为空。正确的方法是:

echo "Hi, ${a}s"

单引号中的变量不会进行变量替换操作。

关于变量,还需要知道几个与其相关的Linux命令。

env用于显示用户环境区中的变量及其取值;set用于显示本地数据区和用户环境区中的变量及其取值;unset用于删除指定变量当前的取值,该值将被指定为NULL;export命令用于将本地数据区中的变量转移到用户环境区。

下面我们来看一个更复杂的例子,结合这个例子,我们来讲述Shell Script的语法。

{C} 1 #!/bin/bash
2 # we have less than 3 arguments. Print the help text:
3 if [ $# -lt 3 ]; then
4 cat<<HELP
5      ren -- renames a number of files using sed regular expressions
6
7      USAGE: ren 'regexp' 'replacement' files
8      EXAMPLE: rename all *.HTM files in *.html:
9      ren 'HTM$' 'html' *.HTM
10
11 HELP
12      exit 0
13 fi
14 OLD="$1"
15 NEW="$2"
16 # The shift command removes one argument from the list of
17 # command line arguments.
18 shift
19 shift
20 # $* contains now all the files:
21 for file in $*; do
22 if [ -f "$file" ]; then
23     newfile=`echo "$file" | sed  "s/${OLD}/${NEW}/g"`
24         if [ -f "$newfile" ]; then
25             echo "ERROR: $newfile exists already"
26         else
27             echo "renaming $file to $newfile "
28             mv "$file" "$newfile"
29         fi
30 fi
31 done

 

我们从头来看,前面两行上一个例子中已经解释过了,从第三行开始,有新的内容。if语句和其他编程语言相似,都是流程控制语句。它的语法是:

if …; then

elif …; then

else

fi

与其他语言不同,Shell Script中if语句的条件部分要以分号来分隔。第三行中的[]表示条件测试,常用的条件测试有下面几种:

[ -f "$file" ] 判断$file是否是一个文件

[ $a -lt 3 ] 判断$a的值是否小于3,同样-gt和-le分别表示大于或小于等于

[ -x "$file" ] 判断$file是否存在且有可执行权限,同样-r测试文件可读性

[ -n "$a" ] 判断变量$a是否有值,测试空串用-z

[ "$a" = "$b" ] 判断$a和$b的取值是否相等

[ cond1 -a cond2 ] 判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立

要注意条件测试部分中的空格。在方括号的两侧都有空格,在-f、-lt、=等符号两侧同样也有空格。如果没有这些空格,Shell解释脚本的时候就会出错。

$#表示包括$0在内的命令行参数的个数。在Shell中,脚本名称本身是$0,剩下的依次是$0、$1、$2…、${10}、${11},等等。$*表示整个参数列表,不包括$0,也就是说不包括文件名的参数列表。

现在我们明白第三行的含义是如果脚本文件的参数少于三个,则执行if和fi语句之间 的内容。然后,从第四行到第十一行之间的内容在Shell Script编程中被称为Here文档,Here文档用于将多行文本传递给某一命令。Here文档的格式是以<<开始,后跟一个字符串,在 Here文档结束的时候,这个字符串同样也要出现,表示文档结束。在本例中,Here文档被输出给cat命令,也即将文档内容打印在屏幕上,起到显示帮助 信息的作用。

第十二行的exit是Linux的命令,表示退出当前进程。在Shell脚本中可以使用所有的Linux命令,利用上面的cat和exit,从一方面来说,熟练使用Linux命令也可以大大减少Shell脚本的长度。

十四、十五两句是赋值语句,分别将第一和第二参数赋值给变量OLD和NEW。紧接下来的两句是注释,注释下面的两条shift的作用是将参数列表中的第一个和第二个参数删除,后面的参数依次变为新的第一和第二参数,注意参数列表原本也不包括$0。

然后,自二十一行到三十一行是一个循环语句。Shell Script中的循环有下面几种格式:

while [ cond1 ] && { || } [ cond2 ] …; do

done

for var in …; do

done

for (( cond1; cond2; cond3 )) do

done

until [ cond1 ] && { || } [ cond2 ] …; do

done

在上面这些循环中,也可以使用类似C语言中的break和continue语句中断 当前的循环操作。第二十一行的循环是将参数列表中的参数一个一个地放入变量file中。然后进入循环,判断file是否为一个文件,如果是文件的话,则用 sed命令搜索和生成新的文件名。sed基本上可以看成一个查找替换程序,从标准输入,例如管道读入文本,并将结果输出到标准输出,sed使用正则表达式 进行搜索。在第二十三行中,backtick(`)的作用是取出两个backtick之间的命令输出结果,在这里,也就是将结果取出赋给变量 newfile。此后,判断newfile是否已经存在,否则就把file改成newfile。这样我们就明白这个脚本的作用了,Shell Script编写的其他脚本与此相似,只不过是语法和用法稍有不同而已。

通过这个例子我们明白了Shell Script的编写规则,但还有几件事情需要讲述一下。

第一个,除了if语句之外,Shell Script中也有类似C语言中多分支结构的case语句,它的语法是:

case var in

pattern 1 )

… ;;

pattern 2 )

… ;;

*)

… ;;

esac

 

我们再就下面一个例子,看看case语句的用法。

while getopts vc: OPTION

do

case $OPTION in

c) COPIES=$OPTARG

ehco "$COPIES";;

v) echo "suyang";;

\?) exit 1;;

esac

done

上面的getopts类似于C语言提供的函数getopts,在Shell Script中,getopts经常和while语句联合起来使用。getopts的语法如下:

getopts option_string variable

option_string中包含一串单字符选项,若getopts在命令行参数中 发现了连字符,那么它会将连字符之后的字符与option_string进行比较,若匹配成功,则把变量variable的值设为该选项,若无匹配,则把 变量的值设为?。有时候,选项还会带一个值,例如-c5等,这时要在option_string中该选项字母后面加上一个冒号,getopts发现冒号 后,会读取该值,然后将该值放入特殊变量OPTARG中。这个命令比较复杂,如有需要,读者可以详细参阅Shell编写的相关资料。

上面这个循环的作用就是依次取出脚本名称后面的选项,进行处理,如果输入了非法选项,则进入"?指定的部分,退出脚本程序。

第二个,Bash提供了一种用于交互式应用的扩展select,用户可以从一组不同的值中进行选择。其语法如下:

select var in …; do

break;

done

例如,下面这段程序的输出是:

#!/bin/bash

echo "Your choice?"

select var in "a" "b" "c"; do

break

done

echo $var

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

Your choice?

1) a

2) b

3) c

第三,Shell Script中也可以使用自定义的函数,其语法形式如下:

functionname()

{

}

例如我们可以把上面第二个例子中第四到第十二行放入一个名为help函数体内,以后每次调用的时候直接写help即可。函数中处理函数调用参数的方法是,直接用上面讲过的$1、$2来分别表示第一、第二个参数,用$*表示参数列表。

第四,我们也可以在Shell下调试Shell Script脚本,当然最简单的方法就是用echo输出查看变量取值了。Bash也提供了真正的调试方法,就是执行脚本的时候用-x参数。

sh ?x filename.sh

这会执行脚本并显示脚本中所有变量的取值,也可以使用参数-n,它并不执行脚本,只是返回所有的语法错误。

 

NFS mount errors with “clnt_create: RPC: Unknown host” for CentOS 6

When attempting to mount CentOS 6, my mount fails with

clnt_create: RPC: Unknown host

Diagnostic:
If we do a more thorough diagnostic, this is the issue

# showmount -e  
clnt_create: RPC: Unknown host  
# showmount -e localhost  
Export list for localhost:  
/export/my_data \*

Resolution:

Taken from Redhat Site

Implement forward and reverse lookups (A records and CNAME records) in DNS and have the system point towards the DNS servers. Implement for both IPv4 and IPv6.If unable to resolve DNS issues, change the /etc/hosts file from this:

Change from

::1          localhost localhost.localdomain localhost6 localhost6.localdomain6

To

::1          machine_hostname localhost localhost.localdomain localhost6 localhost6.localdomain6

Restart the NFS service and check on the showmount -e localhost and showmount -e and attempt to mount the share.

# service nfs restart  
# showmount -e localhost  
# showmount -e

 

玩玩负载均衡—在window与linux下配置nginx

最近有些时间,开始接触负载均衡方面的东西,从硬件F5再到Citrix Netscalar。不过因为硬件的配置虽然不复杂,但昂贵的价格也让一般用户望而却步(十几万到几十万),所以只能转向nginx,squid这类有反向代理功能的软件了。好在其设置都不是很麻烦。

本文就之前所做过的安装和配置步骤做一下总结分享出来,以免日后忘记了。
首先是windows系统,这里建议使用window 2003企业版,而不要作用win7(太新了,我遇到无法启动nginx的问题)。要说的是,在windows下配置安装nginx还是很容易的,少了linux下下载tar再配置编译参数等等步骤,我们只要从下面的地址下载相应的zip包(大约750kb)即可,地址如下:

http://sysoev.ru/nginx/nginx-0.8.21.zip


      需要说明的是这个下载包是nginx 0.8.21开发版,换句话说其只能用于搭建测试环境等用途的,不能用于实际的生产环境(受限于windows文件句柄数限制)。

下载并将该包中的文件解压到c盘上,为了配置使用方便,我将其解压后的文件夹名称从“nginx-0.8.19”改为"nginx”,这样我们只要将要负载均衡的站点在iis中设置好之后,将相应的链接地址放到nginx的相应配置文件中即可,这里我们打开C:\nginx\conf\nginx.conf文件,将下面的内容放到该文件的“server { ”上方行处:

upstream  mylocalsite {
server   10.0.2.137:8088;
server   10.0.2.137:8089;
}

 

因为nginx无法运行动态脚本,所以这里要使用proxy_pass属性进行代理,所以找到该配置文件的如下内容:

location / {
root   html;
index  index.html index.htm;
}

 

修改其内容如下:

 

location / {
proxy_pass http://mylocalsite;
#proxy_set_header   Host             $host;
#proxy_set_header   X-Real-IP        $remote_addr;  ;#防止ajax安全请求问题
#proxy_set_header   REMOTE-HOST        $remote_addr; ;#防止ajax安全请求问题
}

 

修改完之后,还要修改一下server的侦听端口,原内容如下:

server {
listen       80;
server_name  localhost;
……

 

修改完后的内容如下:

 server {
listen       8086;
server_name  10.0.2.136;
……

 

这样,nginx就会在启动之后开始侦听本地IP(10.0.2.136)的8086端口请求,然后将其请求转向到mylocalsite 中所指定的两个iis站点,并将执行的结果转发给客户端。如果一切配置正确,这时可以运行 c:/nginx/nginx.exe (或在cmd下运行“start nginx”),就可以在任务管理器中看到一个nginx进程启动了。(注:如果配置文件有错误,可以到C:\nginx\logs\error.log查看错误日志,进一步排错)。

注: 关闭ngnix的命令: nginx -s stop

配置文件ngnix.conf正确性判断的命令: nginx -t 

 

当然Nginx 负载均衡的功能也是很强的,并且其一般作为七层负载均衡(应用协议层)。下面就其upstream所支持的四个常用设置进行说明:

复制代码

1)、轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2)、weight :指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
2)、ip_hash :每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
3)、fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。
4)、url_hash(第三方)

复制代码

 

按上面的说明,可以将之前我们的upstream做如下修改:

 

upstream  mylocalsite {
#ip_hash;
server   10.0.2.137:8088 weight=2;
server   10.0.2.137:8089 weight=1;
}

 

这个当来了三个http请求时,其中的两个会被分配到10.0.2.137:8088 上,一个分配到10.0.2.137:8089 。当然一开始可以其分摊的请求可以不是太严格按其设置,但当请求数多了之后,基本上就接近于我们分指派的权值了。当然就负载均衡的算法而言,使用weight只是其中的一种,而经常使用的还有许多,比如lvs就在其内部实现了多种的负载均衡算法,可以根据用户的实际环境进行设置布署。。当然就目前而言,nginx的算法相比较还是少了许多,呵呵。

可以说在windows下安装配置还是很方便的,但如果使用loadrunner做并发测试时,就会发现其logs/error.log就会报如下错误:

maximum number of descriptors supported by select() is 1024 while connecting to upstream

我曾经在网上查过解决方案,包括修改配置文件的worker_connections ,如下:

 worker_rlimit_nofile 20240;
events {
#use epoll;//linux下使用
worker_connections  20240;
}

 

但依旧不能将文件句柄数扩充到20240,还是报1024最大句柄数错误。最后实在没办法了,只得开始尝试在linux下安装配置nginx。也就引发了下面的内容。

其实在网上有关介绍如何在linux下安装nginx的要比windows下的要多得多,必定这是‘本家’吧。

因为之前网管只在虚拟机上安装了CentOS5,所以只能就尝试在该linux分支版本下安装了。好在虚拟机已安装完了,剩下的工作并不太多。

首先需要以root身份登陆系统,然后切换身份为超级管理员:

 sudo -s          # 先成为超级管理员

 

然后进入到src目前下,并在当前目录下download nginx.tar.gz包

    cd /usr/src      # 将文件下载到这个目录
wget http://sysoev.ru/nginx/nginx-0.7.62.tar.gz# 下载安装包
tar xzvf nginx-0.7.62.tar.gz   #解压

 

如果下载的nginx 中默认可能没有 rewirte规则,因此需要下载pcre包的扩展来实现这个功能:

      wget http://blog.s135.com/soft/linux/nginx_php/pcre/pcre-7.8.tar.gz    # 下载pcre
tar xzvf pcre-7.8.tar.gz                   # 解压pcre

 

下面编译安装pcre

 cd /usr/src/pcre-7.8;
./configure --prefix=/usr/local/pcre --enable-utf8 --enable-unicode-properties

 

下面编译安装nginx

 cd /usr/src/nginx-0.7.62

 

开始配置要编译的参数(注:内容较长,容易输错。具体参数设置参见http://wiki.codemongers.com/NginxChsInstall

 

./configure --prefix=/usr/local/nginx  --sbin-path=/usr/local/nginx/sbin/nginx  --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --pid-path=/usr/local/nginx/var/nginx.pid --lock-path=/usr/local/nginx/var/nginx.lock --http-client-body-temp-path=/dev/shm/nginx_temp/client_body --http-proxy-temp-path=/dev/shm/nginx_temp/proxy --without-http_rewrite_module --without-http-cache  --without-http_map_module --without-http_gzip_module #使用debuginfo 信息--with-debug

接下来就开始编译生成相应的文件了:

   make
make install

 

然后/dev/shm 也就是内存中,建立一个nginx_temp文件夹

   mkdir /dev/shm/nginx_temp

 

接着创建www用户和组,以及其使用的目录:

   /usr/sbin/groupadd www -g 48
/usr/sbin/useradd -u 48 -g www www
mkdir -p /data0/vshare/htdocs
chmod +w /data0/vshare/htdocs
chown -R www:www /data0/vshare/htdocs

 

这时可以扩充一下文件句柄数(windows下就没这么容易扩展了,哎)

 ulimit -SHn 51200 #设置打开文件句柄

 

到这里,我们就可以使用linux下的vi编辑器编辑一下:

   cd /usr/src/nginx-0.7.62/conf/
vi nginx.conf

 

将之前在window下的修改内容替换(按下insert键进入到编辑模式)到当前的文件中,当修改完成了,按冒号(":")切换到命令模式下,然后敲入“wq”,保存并退出。(强制退出(不保存)的话,输入q!,然后回车)

注:

events {
use epoll;
worker_connections  20240;
}

注:use epoll; //linux下使用,更多内容参见NginxChsOptimizations
这样就可以运行nginx了:

 /usr/local/nginx/sbin/nginx -t –c

创建个软链接: $ sudo ln -s /user/local/nginx/sbin/nginx  /usr/bin/nginx #之前安过的话要先删除sudo rm  /usr/bin/nginx

启动完成后,可以通过如下指令查看其在内存中的运行信息:

# ps aux | egrep '(PID|nginx)'

nginx_config1

 

这样当我们再使用loadrunner运行时,就可以看到error.log中就不再报那个恼人的“1024错误了”。

当然在nginx中,还支持文件缓存,以便于将那些静态文件缓存到本地的nginx服务器上,只不过要修改一下其config文件配置,如下:

vi nginx.conf

在文件中的相应节点处输入如下内容:

复制代码

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|html|htm|css)$ {        #指定缓存文件类型
expires 7d;      #设置浏览器过期时间7天
root data/nginx_cache/iis;          #静态文件根目录目录(必须对应proxy_temp_path)
proxy_store on;        #开启缓存机制
proxy_store_access user:rw group:rw all:rw;       #缓存读写规则
proxy_temp_path data/nginx_cache/iis;            #存放静态文件的缓存目录
#    include proxy.conf;          # 外联proxy理的详细配置如proxy_set_header, client_max_body_size .
if (!-e $request_filename) {
proxy_pass http://10.0.2.136;/
}
}

复制代码

 

这样就会在data/nginx_cache/iis目前下生成相应的gif,jpg等文件的临时信息,当客户端请求到来时,就会从该目录中检索相应文件绑定之后返回给客户端,以减轻iis服务器和网络带宽的压力。

最后附上一个我在那台Centos上的配置文件,大家可以对比参照一下,因为nginx本身提供的配置结点信息过多,更多信息可以参见这篇文章

相关链接如下:

张宴 搭建胜过Apache十倍的Web服务器(第5版)[原创]

守住每一天(网名)       nginx反向代理配置及优化

 

原文链接: http://www.cnblogs.com/daizhj/archive/2009/11/03/1595292.html

作者: daizhj, 代震军

Tags: nginx,负载均衡

网址: http://daizhj.cnblogs.com/

 

Linux 系统如何禁ping, CentOS 禁ping

Linux系统,CentOS操作系统如何设置禁止别人ping我们自己的服务器,下面给大家介绍一些常用的方法:

1、以root账户进入系统,然后编辑文件icmp_echo_ignore_all
vi /proc/sys/net/ipv4/icmp_echo_ignore_all
0 表示允许ping
1 表示禁止ping

可以直接运行以下命令
[root@00isp ~]# echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all
[root@00isp ~]# echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all

此上两条命令的效果实时生效,可以用另外的机器ping来测试是否生效。以上方式只是临时性的禁ping 重启后会失效,如果想要重启过后也不能ping可以做如下操作

/etc/rc.d/rc.local中增加一行
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

另外可以在配置文件 /etc/sysctl.conf 文件中增加一行
net.ipv4.icmp_echo_ignore_all=1

2、使用IPTables禁止PING

echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
这下是别人不能ping你,你也不能ping别人,其实使用iptable最简单
iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP
iptables -A INPUT -p icmp --icmp-type 0 -s 0/0 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 0 -s 192.168.29.1 -j DROP
iptables -A OUTPUT -p icmp --icmp-type 8 -s 192.168.29.1 -j ACCEPT

 

kill -HUP pid

kill -HUP pid
pid 是进程标识。如果想要更改配置而不需停止并重新启动服务,请使用该命令。在对配置文件作必要的更改后,发出该命令以动态更新服务配置。

根据约定,当您发送一个挂起信号(信号 1 或 HUP)时,大多数服务器进程(所有常用的进程)都会进行复位操作并重新加载它们的配置文件。清单 2 显示了向所有正在运行的 Web 服务器进程发送挂起信号的一种方法。

清单 2. 告诉 Web 服务器重新加载其配置文件并对文件进行复位操作
root@holy [507]$ ps -A | grep httpd | grep -v grep | awk '{ print $1; }' | xargs -L 1 sudo kill -HUP
上面的命令中包含了很多的操作,所以让我们来仔细地看一下管道的每个部分。ps 和 grep 命令用来在所有的进程中搜索 httpd(并且忽略用来搜索 httpd 进程的 grep 进程)。接下来,awk 只显示输出结果中的进程 ID,并将它传递给 xargs。然后,xargs 命令接受每个进程 ID(因为使用了 -L 1 以便一次提取一行内容),并使用 sudo kill -HUP 向相应的进程发送一个挂起信号。

LINUX和Unix都适用:
改/etc/ssh/sshd_config,将里面的Port改为新端口,比如10022,然后 kill -HUP `cat /var/run/sshd.pid` 就行了。
现有连接自己不会断,因为kill -HUP `cat /var/run/sshd.pid` 只是HUP监听的那个,已经建立的连接(不同的 pid)不会断。

然后你在现有账号下面exit,在用新的端口登陆就可以了。

PS:

HUP(1)是让进程挂起,睡眠;

kill (9)六亲不认的杀掉

term(15)正常的退出进程

因为进程可能屏蔽某些信号,所以它们的用处也就不一样。。。

 

nginx日志自动分割的完美实现

文件名nginx_access_log.sh 以下是脚本

#!/bin/bash -

#1.nginx日志存放路径

first_path="/lnmp/nginx/logs"

path_array=($first_path)

#2.日志标识前缀数组

first_prefix_sign="first"

prefix_array=($first_prefix_sign)

#3.日志成功错误标识后缀数组

bool_array=("access" "error")

#4.nginx日志切割备份后缀

postfix=`date -d '+0 days' +%Y%m%d`".log"

#5.备份当前的日志文件,重命名改为日期后缀

for path in ${path_array[*]}

do

for prefix in ${prefix_array[*]}

do

for bool in ${bool_array[*]}

do

file=$path/$bool.log

backfile=$path/$prefix.$bool.$postfix

echo $file

echo $backfile

if [ -e $file ];then

mv $file  $backfile

fi

done

done

done

#6.查找nginx进程号,让其产生新的日志文件

nginx_pid=`ps -ef|grep -E 'nginx: master process nginx'|grep -v 'grep'|awk '{print $2}'`

#USR1:Reopen log files,刷新nginx日志文件

kill -HUP $nginx_pid