日常工作积累(待续)

 

执行计划任务时会主动给root发一封信

执行计划任务时会主动给root发一封信,关闭不再发信的方法:

原来是这样:

      [root@scj ~]#crontab -l

      */30 * * * * /usr/sbin/ntpdate ntp.ksyun.cn

改为这样:

      [root@scj ~]#crontab -l

      */30 * * * * /usr/sbin/ntpdate ntp.ksyun.cn > /dev/null  2>&1

注意:2>&1 等价于 &> ,意思是:将 标准正确输出 和 标准错误输出 都输出到一个地方



解决does not map back to the address - POSSIBLE BREAK-IN ATTEMPT

##ssh登陆时报错:
#less /var/log/secure
#Address 192.168.1.168 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!


##分析:
#是因为DNS服务器把 192.168.1.168 的地址反向解析成 localhost 
C:\Users\shencj>nslookup
默认服务器:  localhost
Address:  192.168.3.1

> set type=PTR
> 192.168.1.168
服务器:  localhost
Address:  192.168.3.1

168.1.168.192.in-addr.arpa      name = localhost


##解决方法:
vim /etc/ssh/sshd_config
将UseDNS 改为 no
/etc/init.d/sshd restart



获取一分钟的日志(nginx)

#!/bin/bash
#author: linuxhub.org
#取出nginx一分钟内的日志

#Nginx日志格式:
# 192.168.0.161 - - [26/Mar/2015:14:29:20 +0800] "GET / HTTP/1.1" 200 2126 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36" -

if [ -z $1 ];then
    echo "请在脚本后面加上日志文件!!"
    exit 1
fi

#日志文件
#logfile=/data/logs/nginx/admin.kuaiyouxi.com.log
logfile=$1

#开始时间
start_time=`date -d "10 minutes ago" +"%H:%M:%S"`
#start_time="14:29:20"

#结束时间
stop_time=`date +"%H:%M:%S"`
#stop_time="14:35:36"

tac $logfile | awk  -v st="$start_time" -v et="$stop_time" '
#BEGIN{
#    print "\n-------------------------------";
#    print "开始时间:"st;
#    print "结束时间:"et;
#    print "在这个时间段(1分钟内)的日志如下:"
#    print "---------------------------------\n"
#}

{

    #第4列的时间数据,然后按:冒号进行分割出时间
    #split($4,i,":");

    #组合时间 例: 14:37:49
    #t=sprintf("%s:%s:%s",i[2],i[3],i[4]);

    #第4列的时间数据,取出时:分:秒
    t=substr($5,RSTART+14,21);

    #判断在st与et之间的时间
    if(t>=st && t<=et)
        {print $0}
}
#END{
#    print "\n"
#}'
##获取一分钟内的日志##
sed -n "/$(date -d "1 minutes ago" "+%d\/%b\/%Y:%H:%M")/,/$(date "+%d\/%b\/%Y:%H:%M")/p" access.log




nginx root与alias区别

##Nginx 貌似没有虚拟目录的说法,因为它本来就是完完全全根据目录来设计并工作的。
##如果非要给nginx安上一个虚拟目录的说法,那就只有alias标签比较"像",干脆来说说alias标签和root标签的区别吧。
##最基本的区别:alias指定的目录是准确的,root是指定目录的上级目录,并且该上级目录要含有location指定名称的同名目录。
##另外,根据前文所述,使用alias标签的目录块中不能使用rewrite的break。
##说不明白,看下配置:
location /abc/ {
    alias /home/html/abc/;
}
##在这段配置下,http://ip/abc/a.html就指定的是/home/html/abc/a.html。这段配置亦可改成
location /abc/ {
    root /home/html/;
}
##这样,nginx就会去找/home/html/目录下的abc目录了,得到的结果是相同的。但是,如果我把alias的配置改成:
location /abc/ {
    alias /home/html/def/;
}
##那么nginx将会从/home/html/def/取数据,这段配置还不能直接使用root配置,如果非要配置,只有在/home/html/下建立一个 def->abc的软link(快捷方式)了。
##一般情况下,在location /中配置root,在location /other中配置alias是一个好习惯
location /img/ {
    alias /var/www/image/;
}
#按照上述配置,访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件

location /img/ {
    root /var/www/image;
}
#按照这种配置,访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件

alias是一个目录别名的定义,root则是上层目录的定义

还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的,而root则可有可无




history显示时间

vi /etc/bashrc
##在最后添加:
username=`whoami`
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S $username "
export HISTFILESIZE=1000000
export HISTSIZE=2000

source /etc/bashrc
#history
  321  2015-10-12 10:45:49 root vi /etc/bashrc 
  322  2015-10-12 10:45:57 root source /etc/bashrc
  323  2015-10-12 10:46:02 root ifconfig 
  324  2015-10-12 10:46:04 root history 
  325  2015-10-12 10:46:23 root vi /etc/bashrc 
  326  2015-10-12 10:46:32 root source /etc/bashrc
  327  2015-10-12 10:46:33 root history 
  328  2015-10-12 10:46:42 root date
  329  2015-10-12 10:46:44 root history
  
##数目,时间,用户,命令




nmap扫描端口

 nmap -sS -O 139.196.xxx.xxx



安装epel yum源

 rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm



netstat查看连接情况

netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}'


tomcat部署多个项目

vi server.xml
##在host标签里面添加一个Context标签
<Context path="/pic" reloadable="true" docBase="/photo/pic"/>
##path:别名
##docBase:根目录
访问:ip:8080  默认访问的根目录是webapps
访问:ip:8080/pic  访问的是/photo/pic

参考:http://blog.csdn.net/philosophyatmath/article/details/30246631




tomcat7日志切割

1、下载 
    # wget http://cronolog.org/download/cronolog-1.6.2.tar.gz 
2、解压缩 
    # tar zxvf cronolog-1.6.2.tar.gz 
3、进入cronolog安装文件所在目录 
    # cd cronolog-1.6.2 
4、运行安装 
    # ./configure 
    # make 
    # make install 
5、查看cronolog安装后所在目录(验证安装是否成功) 
    # which cronolog 
    ##一般情况下显示为:/usr/local/sbin/cronolog
vi /usr/local/tomcat7/bin/catalina.sh
##在大约370行
##找到 if [ "$1" = "-security" ] ; then

##修改为:
 if [ "$1" = "-security" ] ; then
    if [ $have_tty -eq 1 ]; then
      echo "Using Security Manager"
    fi
    shift
    eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
      -Djava.security.manager \
      -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
      -Dcatalina.base="\"$CATALINA_BASE\"" \
      -Dcatalina.home="\"$CATALINA_HOME\"" \
      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
      org.apache.catalina.startup.Bootstrap "$@" start 2>&1 \
      | /usr/local/sbin/cronolog /data/tomcat7/logs/catalina.%Y-%m-%d.out >> /dev/null &

  else
    eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
      -Dcatalina.base="\"$CATALINA_BASE\"" \
      -Dcatalina.home="\"$CATALINA_HOME\"" \
      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
      org.apache.catalina.startup.Bootstrap "$@" start 2>&1 \
      | /usr/local/sbin/cronolog /data/tomcat7/logs/catalina.%Y-%m-%d.out >> /dev/null &

  fi
##重启tomcat




nginx服务器http重定向到https的正确写法

server {
       listen         80;
       server_name    my.domain.com;
       return         301 https://$server_name$request_uri;
}

server {
       listen         443 ssl;
       server_name    my.domain.com;

       [....]
}

参考:http://www.sijitao.net/1829.html




nginx的全局变量参数解释

nginx的全局变量参数解释 
    --网站Nginx Rewrite 规则
   
nginx的全局变量参数解释:
$arg_PARAMETER#这个变量包含GET请求中,如果有变量PARAMETER时的值。
$args    #这个变量等于请求行中(GET请求)的参数,例如foo=123&bar=blahblah;
$binary_remote_addr#二进制的客户地址。
$body_bytes_sent#响应时送出的body字节数数量。即使连接中断,这个数据也是精确的。
$content_length#请求头中的Content-length字段。
$content_type#请求头中的Content-Type字段。
$cookie_COOKIE#cookie COOKIE变量的值
$document_root#当前请求在root指令中指定的值。
$document_uri#与$uri相同。
$host#请求主机头字段,否则为服务器名称。
$hostname#Set to the machine’s hostname as returned by gethostname
$http_HEADER
$is_args#如果有$args参数,这个变量等于”?”,否则等于”",空值。
$http_user_agent#客户端agent信息
$http_cookie#客户端cookie信息
$limit_rate#这个变量可以限制连接速率。
$query_string#与$args相同。
$request_body_file#客户端请求主体信息的临时文件名。
$request_method#客户端请求的动作,通常为GET或POST。
$remote_addr#客户端的IP地址。
$remote_port#客户端的端口。
$remote_user#已经经过Auth Basic Module验证的用户名。
$request_completion#如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty)。
$request_method#GET或POST
$request_filename#当前请求的文件路径,由root或alias指令与URI请求生成。
$request_uri#包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。不能修改。
$scheme#HTTP方法(如http,https)。
$server_protocol#请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr#服务器地址,在完成一次系统调用后可以确定这个值。
$server_name#服务器名称。
$server_port#请求到达服务器的端口号。
$uri#不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。该值有可能和$request_uri 不一致。$request_uri是浏览器发过来的值。该值是rewrite后的值。例如做了internal redirects后。
if (-d $request_filename){
  rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}

rewrite后面的flag:

参考:http://www.76ku.cn/articles/archives/317

##nginx中if判断&&
set $flag 0;
if ($uri !~ /login$) {
   set $flag "${flag}1";
}
if ($uri !~ /register.html$) {
   set $flag "${flag}1";
}
if ($uri !~ /account/.*$) {
   set $flag "${flag}1";
}
if ($flag = "0111") {
   #rewrite ^/?.*$ http://$server_name$request_uri;
   rewrite ^(.*) http://$server_name$1 permanent;
}
##nginx中if判断&&




keepalived相关

notify_master/etc/keepalived/master.sh         #当前服务器为主时,觖发执行的脚本
notify_backup/etc/keepalived/slave.sh          #当前服务器为备时,觖发执行的脚本
notify_fault/etc/keepalived/notify_fault.sh    #当前服务器出现问题时,觖发执行的脚本
notify_stop/etc/keepalived/down.sh             #当前服务器为down时,觖发执行的脚本
notify_down /etc/keepalived/killkeepalived.sh  #检测的服务(如:mysql)down掉时,触发执行的脚本

vi /etc/keepalived/master.sh         #增加如下内容
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` change master status!!! " >> /etc/keepalived/change.log
#输出当前时间到日志中

##编写当前服务器为备时的脚本##
vim/etc/keepalived/slave.sh
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` change slave status!!!" >> /etc/keepalived/change.log
#输出当前时间到日志中

##编写当前服务器不正常时的脚本##
vim/etc/keepalived/notify_fault.sh
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` change notify_fault status!!!" >>/etc/keepalived/change.log
#输出当前时间到日志中
sleep 3   #休眠3秒
echo "#`date +"%Y-%m-%d%H:%M"` try startup mysql!!!" >> /etc/keepalived/change.log
#输出当前时间到日志中     
service mysql start     #启动Mysql服务器

##编写当前服务器wodn时的脚本##
vim/etc/keepalived/down.sh
#!/bin/bash
echo "#`date +"%Y-%m-%d%H:%M"` keepalived is down!!!" >> /etc/keepalived/change.log
#输出当前时间到日志中
##单播模式##
vrrp_instance VI_1 {
    state backup
    interface eth0
    virtual_router_id 51
    priority 99
    unicast_src_ip 10.10.191.224      #本机ip
    unicast_peer {
       10.10.150.230                  #对端ip
    }
    advert_int 1
    #nopreempt

    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.113.94
    }
}







大神的博客地址

http://space.itpub.net/26355921  

新浪微博技术总监: http://blog.csdn.net/heiyeshuwu

书记博客:http://www.51clocker.com

startssl证书免费申请步骤:http://blog.csdn.net/ruixue0117/article/details/22201303        #建议使用firefox浏览器









mysql配置主从

wKioL1U_NvOjg3TmAADIY72awEo867.jpg

binlog_format           = MIXED                         //binlog日志格式,mysql默认采用statement,建议使用mixed
log-bin                 = /data/mysql/mysql-bin.log    //binlog日志文件
expire_logs_days        = 7                           //binlog过期清理时间
max_binlog_size         = 100m                       //binlog每个日志文件大小
binlog_cache_size       = 4m                        //binlog缓存大小
max_binlog_cache_size   = 512m                     //最大binlog缓存大小





验证mysql主从数据是否一致(pt-table-checksum和pt-table-sync)

##安装toolkit需要一些依赖包
yum -y install perl perl-DBI perl-DBD-MySQL perl-IO-Socket-SSL perl-Time-HiRes

参考:http://www.cnblogs.com/zhoujinyi/archive/2013/05/09/3067045.html







zabbix触发器表达式常用的两个函数

last:

{www.zabbix.com:system.cpu.load[all,avg1].last(0)}>5 

意思是:最后时刻cpu的负载大于5,则触发报警


min:

{www.solutionware.com:net.if.in[eth0,bytes].min(60)}>100K

意思是:60秒内流进网卡的流量持续大于100K,则报警


Name 触发器名称.
名称可以包含宏变量: {HOST.HOST}, {HOST.NAME}, {HOST.CONN}, {HOST.DNS}, {HOST.IP}, {ITEM.VALUE}, {ITEM.LASTVALUE} and {$MACRO}.
$1, $2…$9 可以被用来关联表达式的常量
示例:
name:Processor load above $1 on {HOST.NAME}”
表达式:
system.cpu.load[percpu,avg1].last(0)}>5
会显示为:Processor load above 5 on ttlsa云服务器
Expression 计算触发器状态的逻辑表达式,这边设置为上一次值等于0
Multiple PROBLEM events generation 通过设置该选项,你可以在触发器产生problem的时候触发一个事件
Description 触发器的描述,一般name写的不清楚,这边可以具体描述这个触发器的作用,例如nginx当前离线,请处理等等。Zabbix 2.2版本开始,支持触发器名称。
URL 在Monitoring → Triggers中,可以看到URL并且可以点击,一般情况下他需要配合触发器ID来使用,在url中包含触发器ID(宏变量 {TRIGGER.ID}),这样可以直接点击到具体触发器中。
Severity 设置严重性级别,上图我设置为“灾难”,你可以相应的设置警告、严重等状态的触发器
Enabled 当前触发器是否启用



zabbix自定义key注意事项

UserParameter=sjsyServer.status,/etc/zabbix/itemscripts/mysqlstatus.sh

注意:zabbix用户要对/etc/zabbix/itemscripts/mysqlstatus.sh这个文件有执行权限

[root@localhost itemscripts]# ll /etc/zabbix/itemscripts/mysqlstatus.sh 
-rwxr--r-- 1 zabbix root 114 Sep 14 12:25 /etc/zabbix/itemscripts/mysqlstatus.sh

否则:

[root@localhost ~]# zabbix_get -s 192.168.188.129 -k sjsyServer.status

##获取的结果将会是空






saltstack相关

saltstack中文wiki社区:http://www.saltstack.cn/projects/cssug-kb/wiki

saltstack中文介绍:http://docs.saltstack.cn/zh_CN/latest/

saltstack官网:http://saltstack.com/

saltstack配置实例:http://bbs.chinaunix.net/thread-4142057-1-1.html

salt写的相当不错:http://my.oschina.net/u/877567/blog?catalog=404877

                  http://my.oschina.net/xxbAndy/blog/391591

                  http://my.oschina.net/guol/blog/156610

salt所有资源: http://docs.saltstack.cn/zh_CN/latest/ref/states/all/index.html








磁盘inode不足 

最近磁盘总是写不上数据,查看磁盘空间(df -h)发现空间只用了不到5%,后来找到牛人才知道是磁盘inode已经用完了,可使用df -hi查看磁盘inode使用情况。


原因:使用/ext3的磁盘inode空间只有几百K,如果存储太多的小文件导致空间不足时就无法再创建新的文件。


解决方案:使用xfs的磁盘格式,可增加inode大小。

执行步骤:

1.   安装xfsprogs-2.9.4-1.el5.centos.x86_64.rpm   

     rpm -ivh http://mirror.centos.org/centos/5/extras/x86_64/RPMS/xfsprogs-2.9.4-1.el5.centos.x86_64.rpm 

     或者将包下载下来手动安装

2.   将挂载磁盘空间数据备份,并将该磁盘卸载:

     umount /data

     如果失败,执行以下命令查看使用/data文件的所有进程:

     lsof |grep /data

     执行以下命令将进程杀死:

     lsof |grep /data |awk -F" " '{print $2}' |xargs kill

3.   执行以下命令将磁盘格式化为xfs

     mkfs.xfs -f /dev/xvdb

4.   修改/etc/fstab,将挂载磁盘的格式由ext3改为xfs

5.   重新挂载磁盘:mount -a






iptables

每次执行 iptables -A 添加规则后,一定要记得执行:

[root@scj ~]# /etc/init.d/iptables save








lrzsz

rz:将windous端数据传到linux服务器上

rz -y:将windous端数据传到linux服务器上,并覆盖掉原来相同文件名的文件

sz httpd.conf:将linux服务器上的httpd.conf文件传到windous端








svn同步数据到线上服务器

只同步指定版本到最新版本被改过的数据:

在线上服务器写一个脚本,代码如下:

#!/bin/bash
#此脚本是根据svn版本号,指定版本到最新版本只同步更改过的文件到服务端

Svnurl=http://ip/svn/zhushen/server
Web_server_dir=/tmp/scj/server
Log_dir=/tmp/scj

#列出指定版本到最新版本被更改过的文件
Update_server_xml=$(/usr/bin/svn diff -r $1:HEAD $Svnurl 2> /dev/null | grep Index |awk -F":" '{print $2}')

#同步被改过的文件
case $1 in
  [0-9]*)
    echo ===================== >> $Log_dir/update.log 2>&1
    echo $(date +%F-%H:%M:%S) >> $Log_dir/update.log 2>&1
    for conf_xml in $Update_server_xml
    do
      /usr/bin/svn  export  $Svnurl/$conf_xml  $Web_server_dir/$conf_xml  --force
      echo $conf_xml >> $Log_dir/update.log
    done
  ;;
  *)
    echo "输入版本号"
  ;;
esac








常用数据下载

稀酷客: http://www.ckook.com/









netstat 出现大量的close_wait状态

wKiom1Voi_Dj8p1dAAP0p4w0660637.jpg


出现这种问题的主要原因:

    客户端主动关闭连接,服务端由于某种原因没有即使向客户端发送FIN数据请求,导致服务端没有即使将连接释放掉


解决方法:

    通过修改系统的内核参数(tcp_keepalive相关的)来解决问题:

    net.ipv4.tcp_keepalive_time=30

    net.ipv4.tcp_keepalive_probes=2

    net.ipv4.tcp_keepalive_intvl=2

    sysctl -p          #使立即生效

    注意:内核参数我调整的可能有些猛,到底合不合适要注意观察

         参考链接:

                 http://ipsysctl-tutorial.frozentux.net/

                 http://haka.sharera.com/blog/BlogTopic/32309.htm

注意:其实出现这种问题根本的原因还是程序代码有问题







find查找某一个文件


find . -name  'file*'             #查找当前目录下file开头的文件

注意:-name后面的关键字要用引号引起来,如'file*'


##find查找目录## 只查找/backup/目录下的所有一级目录
find /backup/ -maxdepth 1 -type d -mtime +15 -exec rm -rf {} \;
##-maxdepth 1 -type d,只显示一级目录

使用find在目录下查找文件里含有"INFORMATION"字符串的文件名

[root@scj postfix]# find /etc/postfix/ | xargs grep "INFORMATION" | awk -F":" '{print $1}' | sort |uniq 

/etc/postfix/main.cf

[root@scj postfix]# find /etc/postfix/ | xargs grep "INFORMATION" | awk -F":" '{print $1}' | awk -F"/" '{print $NF}'|sort |uniq 

main.cf





磁盘报警快速查找方法

1、df -h

   查看挂载情况和每个分区的使用情况

2、du -h --max-depth=1

   查看当前目录下,每个目录里数据的大小(只能查看目录,文件会忽略掉),深度是1(也就是只查看当前的一级目录)

[root@scj tmp]# du -h --max-depth=1
12K	./scripts
96K	./salt
2.1G	./lishi
4.0K	./.ICE-unix
8.0K	./pear
2.1G	./beifen
4.2G	.

   可以看出/tmp目录下,总共有4.2G的数据,beifen目录和linshi目录各有2.1G

3、du -sh

   查看当前目录下所有数据的大小

[root@scj tmp]# du -sh
4.2G	.

4、du -sh *

   突然知道这个命令更好用,不仅统计所有目录,还统计所有文件(当前目录下的一级文件和子目录)

[root@scj tmp]# du -sh *
4.0K	aa
4.0K	beifen
4.0K	file1
2.1G	lishi
0	mysqld.sock
620K	mysqldump.sql
8.0K	pear
4.0K	percona-version-check
16K	php-fpm.log
96K	salt
12K	scripts
0	www.log.slow
0	yum.log
4.0K	yum_save_tx-2015-04-21-06-053qooJ4.yumtx
4.0K	yum_save_tx-2015-04-21-07-03wAW6m7.yumtx
8.0K	yum_save_tx-2015-04-29-11-12VLBEZO.yumtx
8.0K	yum_save_tx-2015-04-29-11-17jxd71y.yumtx
8.0K	yum_save_tx-2015-04-29-11-188of3QH.yumtx

利用上面四个命令可以快速定位某个目录(其实第二个命令可以被第四个命令替代了)







创建逻辑卷

新买进一台服务器,用来存数据库数据

最好的方法是将磁盘做成逻辑卷(将来可动态扩展)

步骤:http://www.cnblogs.com/xiaoluo501395377/archive/2013/05/24/3096087.html


缩减home逻辑卷,添加到/(根)逻辑卷下:

    http://www.php114.net/2013/1019/637.html

    http://www.cnblogs.com/xiaoluo501395377/archive/2013/05/24/3097785.html









rpm包下载地址

163网易:

http://mirrors.163.com/centos/


东北大学:

http://mirror.neu.edu.cn/centos/


搜狐CentOS镜像: 

http://mirrors.sohu.com/centos/


电子科技大: 

http://mirrors.stuhome.net/centos/


中科大:

http://centos.ustc.edu.cn/centos/







两次fork()原因

1、子进程的产生:

    执行任何程序,父进程会产生子进程,由子进程去完成;子进程会被分配一定的资源,同时子进程会继承父进程的所有资源环境

2、执行fork()函数:

    执行fork()函数会产生一个子进程,fork()函数会返回两个值,子进程号和0,若是父进程则返回子进程号,若是子进程则返回0;若调用fork()函数失败则返回-1(失败原因:进程数达到上限;内存不足)

3、孤儿进程:

    父进程产生一个子进程,若父进程在子进程结束之前结束,则这个子进程就会变为孤儿进程,不过,这个子进程之后会由init这个进程去管理,同时子进程结束时,资源也会被init进程回收

4、僵尸进程:

    父进程产生一个子进程,子进程结束时,父进程没有用waitwaitpid回收子进程,这时候这个子进程就会变成僵尸进程,僵尸进程不会占用系统资源,不过会占用进程表,虽然僵尸进程不占用资源,但是如果僵尸进程多了也会影响系统性能

5、两次fork():

   为了避免出现僵尸进程,就需要执行两次fork();父进程执行fork产生子进程,子进程再执行fork产生一个子子进程;子子进程的父进程是子进程,子进程的父进程可能是一个一直在运行的某个服务, 我们把子进程停掉,这时候子子进程就会由init进程去管理,之后子子进程结束时,资源也由init进程去回收

6、参考:http://www.linuxidc.com/Linux/2011-08/40590.htm







守护进程

1、定义:

    守护进程:脱离终端并且在后台运行的进程

    守护进程脱离终端:避免进程在执行过程中的信息在任何终端上显示;进程不会被任何终端所产生的终端信息所打断

2、创建步骤:

    创建子进程,退出父进程:

        使用fork()函数和if判断语句,使子进程变为孤儿进程,交给init进程管理

pid = os.fork()         #调用fork()函数
if pid < 0:             #小于0,表明调用fork失败
    print 'invoke fork() failure'
    sys.exit(1)         #退出脚本
elif pid > 0:           #大于0,表明是父进程
    sys.exit(0)         #退出父进程

    在子进程中创建新会话:

        这个步骤是创建守护进程中最重要的一步;调用fork函数创建子进程时,子进程继承了父进程的全部资源环境(包括会话期、进程组、控制终端等),虽然父进程退出了,但会话期、进程组、控制终端等并没有改变,因此,子进程并没有真正的独立出来,而setsid函数能够使子进程完全独立出来

os.setsid()             #调用setsid()函数

    改变当前目录为根目录:

        调用fork()函数创建子进程,子进程也会继承父进程的当前工作目录,若子进程使用父进程的当前工作目录可能会有一些问题

os.chdir("/")

    重设文件权限掩码:

        把文件权限掩码设置为0,可以大大增强守护进程的灵活性

os.umask(0)

3、一个创建守护进程的实例:

vi /tmp/dir1/file.py
#encoding:utf-8
import os
import sys
import time
import commands

pid = os.fork()         #调用fork()函数
if pid < 0:             #小于0,表面调用fork失败
    print 'invoke fork() failure'
    sys.exit(1)         #退出脚本
elif pid > 0:           #大于0,表面是父进程
    sys.exit(0)         #退出父进程,下面所有命令都是在子进程下执行

os.setsid()             #在子进程中调用setsid函数
os.chdir("/")
os.umask(0)
while True:
    os.system('echo `date +%F-%H%M%S` >> /tmp/dir1/file')
    time.sleep(1)

 

[root@scj dir1]# python /tmp/dir1/file.py 
[root@scj dir1]# ps -ef | grep file.py
root      3282     1  0 02:46 ?        00:00:00 python /tmp/dir1/file.py
root      3311  1575  0 02:46 pts/1    00:00:00 grep file.py

由上发现:file.py被放在后台作为守护进程运行,父进程号是1(也就是init进程)

注意:守护进程由init进程管理

[root@scj dir1]# tail -f /tmp/dir1/file
2015-06-23-025041
2015-06-23-025042
2015-06-23-025043
2015-06-23-025044
2015-06-23-025045
2015-06-23-025046
2015-06-23-025047
2015-06-23-025048
2015-06-23-025049
2015-06-23-025050
2015-06-23-025051
2015-06-23-025052
2015-06-23-025053
2015-06-23-025054

每秒执行一次

4、停止守护进程的方法:

    使用kill杀死

[root@scj dir1]# ps -ef | grep file.py
root      3282     1  0 02:46 ?        00:00:00 python /tmp/dir1/file.py
root      4195  1575  0 02:51 pts/1    00:00:00 grep file.py
[root@scj dir1]# kill -9 3282






添加静态路由

另一种永久的方法:

wKioL1WaGFPzfS2rAAKHVwtZaMQ576.jpg

###设置eth0上的路由,如果不默认网关在eth0上,就不用设置了
#cat > /etc/sysconfig/network-scripts/route-eth0 << EOF
#10.0.0.0/8 via 10.126.40.254
#EOF






内核优化

net.core.wmem_max = 873200
net.core.rmem_max = 873200
net.core.netdev_max_backlog = 1024
net.core.somaxconn = 512
net.ipv4.tcp_mem = 786432  1048576 1572864
net.ipv4.tcp_wmem = 8192  436600  873200
net.ipv4.tcp_rmem = 8192  436600  873200
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_fin_timeout = 30 
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024  65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
#### sysctl.conf setting  设置内核参数
cat >> /etc/sysctl.conf << EOF
###下面的TCP内核参数的调整都是为了让服务器可以应对大的或突发性的连接数(如上万的ESTALISH连接)
这些调整在nginx/squid/varnish/httpd/ftp这样有会产生大量的TCP连接的应用上,是需要的
##最大的TCP数据接收窗口(字节)
net.core.wmem_max = 873200
##最大的TCP数据发送窗口(字节)
net.core.rmem_max = 873200
##每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的最大数目,默认是300
net.core.netdev_max_backlog = 1024
##定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。
net.core.somaxconn = 512
##下面的三个要一起看
##第一个net.ipv4.tcp_mem[0][1][2]表示TCP整体内存使用,计算方式是值*内存页大小4K;
##三个值分别是低于[0]值,表示TCP没有内存压力,在[1]值下,进入内存压力阶段,大于[2]高于此值,TCP拒绝分配连接
##net.ipv4.tcp_wmem[0][1][2]分别表示最小发送内存,默认发送内存,最大发送内存;
##结合上面的net.ipv4.tcp_mem[0][1][2]三个值,当TCP总内存占用小于tcp_mem[0]时,可以分配小于tcp_wmem[2]的内存给一个TCP连接;
##当TCP内存占用大于tcp_mem[0]时,可以分配tcp_wmem[0]的内存;
##当TCP总内存占用大于tcp_mem[1],小于tcp_mem[2]时,可以分配tcp_wmem[0]的内存;
##当TCP总内存占用大于tcp_mem[2]时,tcp内存分析无法进行
##net.ipv4.tcp_rmem的三个值的解释同上。
net.ipv4.tcp_mem = 786432  1048576 1572864  #设置[0][1][2]分别为3G、4G、6G
net.ipv4.tcp_wmem = 8192  436600  873200   #设置TCP发送缓存分别为:最小8K,默认400k,最大800K
net.ipv4.tcp_rmem = 8192  436600  873200   #设置TCP接收缓存分别为:最小8K,默认400k,最大800K
net.ipv4.tcp_retries2 = 5  #TCP失败重传次数,默认值15,意味着重传15次才彻底放弃.可减少到5,以尽早释放内核资源
net.ipv4.tcp_fin_timeout = 30  #表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
net.ipv4.tcp_keepalive_time = 1200  #表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟
net.ipv4.tcp_syncookies = 1  #开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击
net.ipv4.tcp_tw_reuse = 1  #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,减少TIME-WAIT 状态
net.ipv4.tcp_tw_recycle = 1  #表示开启TCP连接中TIME-WAIT sockets的快速回收
net.ipv4.ip_local_port_range = 1024  65000  #增大本地端口数,对于发启很多对外的连接时有用
net.ipv4.tcp_max_syn_backlog = 8192 # 进入SYN包的最大请求队列.默认1024.对重负载服务器,增加该值显然有好处
net.ipv4.tcp_max_tw_buckets = 5000  #表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息,默认为180000
###这四个是用来设置lvs实体机用的,如果你的机器不使用lvs的DR方式,可以不加这几个参数
net.ipv4.conf.lo.arp_ignore = 1  
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
EOF

参考: http://waringid.blog.51cto.com/65148/183496/

wKioL1XISK7zmS2aAAKvAQdBxHA741.jpg





nohup

如果我们想把一个进程放在后台运行,可以使用&;但是只使用&把进程放在后台运行会有问题,就是当我们退出账号或是注销用户时,这个进程就会消失;为了避免退出账号时进程就会消失,可以使用nohup,就是no hang up 不挂起的意思





sed添加多行

[root@scj www.scj.com]# cat file2.sh 
aaaaaa
bbbbbb
cccccc
dddddd

在第二行后面添加如下内容:

#备份6服 血色城堡
dbname='gamedb_xscb logdb_xscb'
dumpname='6f_xscb'

mysqldump  --opt --default-character-set=utf8 --databases  $dbname > ${backuptodir}${dumpname}_full_`date +%Y%m%d%H%M`.sql
cd $backuptodir
dumpfile=`find . -type f -name "${dumpname}*" | sort | tail -n1 | awk -F'/' '{print $2}'`
tar -zcf ${dumpname}_full_`date +%Y%m%d%H%M`.tar.gz $dumpfile
rm -rf $dumpfile
[root@scj www.scj.com]# sed -i '2a\\n#备份6服 血色城堡\ndbname='"'gamedb_xscb logdb_xscb'"'\ndumpname='"'6f_xscb'"'\n\nmysqldump  --opt --default-character-set=utf8 --databases  $dbname > ${backuptodir}${dumpname}_full_`date +%Y%m%d%H%M`.sql\ncd $backuptodir\ndumpfile=`find . -type f -name "${dumpname}*" | sort | tail -n1 | awk -F'"'/'"' '"'{print \$2}'"'`\ntar -zcf ${dumpname}_full_`date +%Y%m%d%H%M`.tar.gz $dumpfile\nrm -rf $dumpfile\n' file2.sh 
[root@scj www.scj.com]# cat file2.sh 
aaaaaa
bbbbbb

#备份6服 血色城堡
dbname='gamedb_xscb logdb_xscb'
dumpname='6f_xscb'

mysqldump  --opt --default-character-set=utf8 --databases  $dbname > ${backuptodir}${dumpname}_full_`date +%Y%m%d%H%M`.sql
cd $backuptodir
dumpfile=`find . -type f -name "${dumpname}*" | sort | tail -n1 | awk -F'/' '{print $2}'`
tar -zcf ${dumpname}_full_`date +%Y%m%d%H%M`.tar.gz $dumpfile
rm -rf $dumpfile

cccccc
dddddd

解析:

[root@scj www.scj.com]# sed '1a\hello' file2.sh    #在第一行后面添加hello一行,sed最外面必须用单引号,必须
aaaaaa
hello
bbbbbb
[root@scj www.scj.com]# sed '1a\hello\nworld' file2.sh   #添加两行,用\n进行换行
aaaaaa
hello
world
bbbbbb
##在第一行后面添加'hello',要带着单引号
[root@scj www.scj.com]# sed '1a\'"'hello'"'' file2.sh 
aaaaaa
'hello'
bbbbbb
##这里在单引号里用'"'把hello引起来即可
[root@scj www.scj.com]# sed '13a\\n' file1.sh && sed "14a\#备份6服 血色城堡\ndbname='gamedb_xscb logdb_xscb'\ndumpname='6f_xscb'\n" file1.sh         #sed里面若引用变量,此时最外面要用双引号
[root@scj www.scj.com]# sed '1a\if\n  {\n    echo hello\n  }' file2.sh 
aaaaaa
if
  {
    echo hello
  }
bbbbbb
##有几个空格就在单引号写几个空格






ls几个参数

ls:默认是按文件(目录)名的首字母进行排序的

##注意:pear是目录
[root@scj tmp]# ls
file1  file2  file3.sh  gamedb.sql  logdb.sql  mysqldump.sql  pear  test  yum.log  zookeeper
[root@scj tmp]# ls -l
total 664
-rw-r--r--  1 user1  nobody      6 Apr 15 06:57 file1
-rw-r--r--  1 nobody nobody      6 Apr 15 07:00 file2
-rw-r--r--  1 root   root      246 Aug 21 13:23 file3.sh
-rw-r--r--  1 root   root    11461 Aug 12 05:07 gamedb.sql
-rw-r--r--  1 root   root     7102 Aug 12 05:07 logdb.sql
-rw-r--r--  1 root   root   631787 May  6 11:47 mysqldump.sql
drwxr-xr-x  3 root   root     4096 Apr 10 14:13 pear
-rw-r--r--  1 root   root        7 Aug 21 13:25 test
-rw-------. 1 root   root        0 Apr  3 15:01 yum.log
drwxr-xr-x  2 root   root     4096 Apr  8 09:45 zookeeper

ls -r:按文件名首字母反向排序

[root@scj tmp]# ls -r
zookeeper  yum.log  test  pear  mysqldump.sql  logdb.sql  gamedb.sql  file3.sh  file2  file1

ls -t:按文件(目录)的修改时间排序

##最近修改时间在前面
[root@scj tmp]# ls -t
test  file3.sh  gamedb.sql  logdb.sql  mysqldump.sql  file2  file1  pear  zookeeper  yum.log
[root@scj tmp]# ls -lt
total 664
-rw-r--r--  1 root   root        7 Aug 21 13:25 test
-rw-r--r--  1 root   root      246 Aug 21 13:23 file3.sh
-rw-r--r--  1 root   root    11461 Aug 12 05:07 gamedb.sql
-rw-r--r--  1 root   root     7102 Aug 12 05:07 logdb.sql
-rw-r--r--  1 root   root   631787 May  6 11:47 mysqldump.sql
-rw-r--r--  1 nobody nobody      6 Apr 15 07:00 file2
-rw-r--r--  1 user1  nobody      6 Apr 15 06:57 file1
drwxr-xr-x  3 root   root     4096 Apr 10 14:13 pear
drwxr-xr-x  2 root   root     4096 Apr  8 09:45 zookeeper
-rw-------. 1 root   root        0 Apr  3 15:01 yum.log

ls -rlt:按修改时间反向排序

[root@scj tmp]# ls -ltr
total 664
-rw-------. 1 root   root        0 Apr  3 15:01 yum.log
drwxr-xr-x  2 root   root     4096 Apr  8 09:45 zookeeper
drwxr-xr-x  3 root   root     4096 Apr 10 14:13 pear
-rw-r--r--  1 user1  nobody      6 Apr 15 06:57 file1
-rw-r--r--  1 nobody nobody      6 Apr 15 07:00 file2
-rw-r--r--  1 root   root   631787 May  6 11:47 mysqldump.sql
-rw-r--r--  1 root   root     7102 Aug 12 05:07 logdb.sql
-rw-r--r--  1 root   root    11461 Aug 12 05:07 gamedb.sql
-rw-r--r--  1 root   root      246 Aug 21 13:23 file3.sh
-rw-r--r--  1 root   root        7 Aug 21 13:25 test






刷博客访问次数

import webbrowser
import time
import os

z = 1
while z <= 5:
    x = 1
    while x <= 10:
        webbrowser.open_new_tab("http://732233048.blog.51cto.com/9323668/1625477")
        x = x + 1
        time.sleep(1)
    else:
        os.system("taskkill /F /IM 360se.exe")
    z = z + 1

注意:

    博文的链接地址:http://732233048.blog.51cto.com/9323668/1625477

    360浏览器的程序名称:360se.exe

    windows杀掉浏览器程序的命令:taskkill /F /IM 360se.exe

    本例中共打开50次:

        里面循环打开10次,关闭浏览器

        外面循环5次





git

git乱码问题:http://segmentfault.com/a/1190000000578037

git使用:http://blog.csdn.net/vipzjyno1/article/details/






lsof和fuser

lsof:查看某个进程打开使用的文件有哪些

      lsof | grep puppet :查看puppet进程所打开的文件


fuser:查看某一个文件是由哪个进程打开的

      fuser -v /usr/lib/ruby/1.8/i386-linux/syck.so:包含用户,进程号及command等等

      fuser -m  :后面接的那个文件名会主动上提到该文件系统的最顶层,对umount不成功很有效

            如:fuser -m /home   查看home正在被哪些进程所使用

                fuser -m /home/xxxx/xxxx    上跳到文件系统最顶层/home

[root@localhost ~]# lsof -i :80
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   1634   root    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   1662 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   1663 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   1664 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   1665 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   1714 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   1715 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   1716 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   1717 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   2086 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
httpd   2087 daemon    4u  IPv6  10007      0t0  TCP *:http (LISTEN)
[root@localhost ~]# ps -ef | grep http
root       1634      1  0 05:17 ?        00:00:03 /usr/local/apache2/bin/httpd -k start
daemon     1662   1634  0 05:17 ?        00:00:01 /usr/local/apache2/bin/httpd -k start
daemon     1663   1634  0 05:17 ?        00:00:01 /usr/local/apache2/bin/httpd -k start
daemon     1664   1634  0 05:17 ?        00:00:01 /usr/local/apache2/bin/httpd -k start
daemon     1665   1634  0 05:17 ?        00:00:02 /usr/local/apache2/bin/httpd -k start
daemon     1714   1634  0 05:20 ?        00:00:02 /usr/local/apache2/bin/httpd -k start
daemon     1715   1634  0 05:20 ?        00:00:01 /usr/local/apache2/bin/httpd -k start
daemon     1716   1634  0 05:20 ?        00:00:01 /usr/local/apache2/bin/httpd -k start
daemon     1717   1634  0 05:20 ?        00:00:02 /usr/local/apache2/bin/httpd -k start
daemon     2086   1634  0 09:26 ?        00:00:01 /usr/local/apache2/bin/httpd -k start
daemon     2087   1634  0 09:26 ?        00:00:02 /usr/local/apache2/bin/httpd -k start
root       2899   2771  0 15:54 pts/3    00:00:00 grep http
[root@localhost ~]# lsof -i :80 |wc -l
12
[root@localhost ~]# ps -ef | grep http|wc -l
12








centos查看网卡流量iftop

top:用来查看系统的性能情况

l: 切换显示平均负载和启动时间信息。即显示隐藏第一行
m:切换显示内存信息。即显示隐藏内存行
t: 切换显示进程和CPU状态信息。即显示隐藏CPU行
c:切换显示命令名称和完整命令行。 显示完整的命令。 这个功能很有用。
M: 根据驻留内存大小进行排序。
P:根据CPU使用百分比大小进行排序。
T:根据时间/累计时间进行排序

top -bc -n1 与 ps -ef 功能差不多,且更详细;在方括号'[]'里的都是内核级进程


iftop:用来查看网卡流量情况

参考:

    http://blog.csdn.net/gaojinshan/article/details/40781241

    http://down.chinaz.com/server/201112/1478_1.htm













本文出自 “见” 博客,谢绝转载!

你可能感兴趣的:(linux,root,电邮)