执行计划任务时会主动给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配置主从
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状态
出现这种问题的主要原因:
客户端主动关闭连接,服务端由于某种原因没有即使向客户端发送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、僵尸进程:
父进程产生一个子进程,子进程结束时,父进程没有用wait或waitpid回收子进程,这时候这个子进程就会变成僵尸进程,僵尸进程不会占用系统资源,不过会占用进程表,虽然僵尸进程不占用资源,但是如果僵尸进程多了也会影响系统性能
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
添加静态路由
另一种永久的方法:
###设置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/
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
本文出自 “见” 博客,谢绝转载!