logrotate-3.7.8-26.el6_7.x86_64
/usr/sbin/logrotate -f /etc/rsync.logrotate
cat /etc/rsync.logrotate






日志分割常用方法:

自己写脚本分割
使用linux自带的logrotate
前者灵活,可以应对各种需求,自定义文件夹、文件名。后者配置简单,使用方便。

下面我们以分割nginx日志为例介绍一下使用logrotate分割日志实例。

logrotate简单介绍

logrotate使用cron按时调度执行,日志的执行过程原理为不断改名称:比如你有个access.log文件,需要保留4个日志文件,那么logrotate是这么轮转的:

access.log满足轮转条件?(调度时间,日志大小是否满足要求)如果需要轮转则进行下列步骤,否则跳过
access.log.3存在?如果存在则删除
access.log.2如果存在则改名为access.log.3
access.log.1如果存在则改名为access.log.2
access.log如果存在则改名为access.log.1
创建一个空的access.log文件

如下图所示:
点击在新窗口中浏览此图片
logrotate配置文件一般在:

/etc/logrotate.conf 通用配置文件,可以定义全局默认使用的选项。
/etc/logrotate.d/xxx 自定义服务配置文件

我们可以看下/etc/logrotate.conf里面的内容


我们新建一个/etc/logrotate.d/nginx来分割nginx日志,配置文件内容如下:


第一行:指明日志文件位置,多个以空格分隔
第二行:调用频率,有:daily,weekly,monthly可选
第三行:总共轮换多少个日志文件,这里为保留15个
第四行:限制条件,大于10M的日志文件才进行分割,否则不操作

sharedscripts用于指明以下是执行轮转前和轮转后自定义执行的命令,比如postrotate和endscript表示,轮转后,执行nginx的重新加载配置文件,避免日志轮转后不写日志。如果要轮转前执行某个命令可以使用prerotate代替postrotate即可,两者可同时存在。

可以通过man logrotate查看更多选项

默认logrotate是通过crontab定期执行的,我们也可以手动执行查看结果:

# logrotate -vf /data/log/nginx/access.log
v选项表示查看详细执行过程
f表示强制执行日志轮转(不然时间不到,日志文件大小等条件不满足,不会执行)
强烈建议执行一下,了解下执行过程。

验证是否执行,查看cron的日志即可

# grep logrotate /var/log/cron

摘自:http://www.williamsang.com/archives/1254.html
一直提示:Git不是最新,装了好几次还是不行,后来发现:
安装完TortoiseGit,右键,在桌面上TortoiseGit里面有一个abount,里面有安基于哪个git的目录,我这一直是在aptana了,后来删除后,就对了:
TortoiseGit 2.1.0.0 (D:\Program Files\TortoiseGit\bin)
git version 2.9.0.windows.1 (D:\Program Files\Git\bin; D:\Program Files\Git\mingw32\; D:\Program Files\Git\mingw32\etc\gitconfig; C:\ProgramData\Git\config)

这种情况有可能是因为:
1.早期安装过aptana,里面有那个git了。
2.同时后来安装了TortoiseGit的版本和aptana里的git匹配,后来让TortoiseGit自己升级后就慢慢匹配不起来了。
3.再后来,即使更新了新的git,但是TortoiseGit里指向的还是aptana里的,所以一直提示,后来我直接删除后就好了。

注意:这个TortoiseGit最好是不要让它自动更新为好,哈哈~再就是老的TortoiseGit还有中文文件名在提交到仓库里出现乱码问题,删都删除不掉。
背景:在本人用PHP和硬件进行交互的时候,用过dio_open这些,但硬件有硬件的特点,特别是一些位啥的,这儿就有一个问题涉及到串口16进制啥的,这位兄弟在实践中遇到的一些转化如:chr()、hexdec()、bin2hex()这3个函数,网上还提到了用pack()、unpack(),因为前面3个函数以及很好的解决了问题,所以就没有继续深入。 再就是用fiddler来看发送的十六进制,以及在进行十六进制转十进制的一些问题,很有价值:
一)转换函数:


二)再谈fiddler2的一个好处:
优雅的快速测试
由于PHP是弱类型,因此理解起来比较费解。接收数据和向硬件发送数据的数据类型是不一样的。用bin2hex()得到的是形如"11 00 00 FE"的字符串,用chr(hexdec())得到的是16进制的ASCII码,如果echo输出的话,会是乱码。那么如何测试(看到)自己生成的16进制ASCII码数据是否正确呢?1种是找一个TCP/IP工具发送过去,这种麻烦了点,我推荐用fiddler监听。


HexView中的黑色部分就是你发送的
你可以快速方便的用一个web页面输出你的ASCII码,在fiddler的HexView中,就可以看到原汁原味你发送的16进制数据了。另外,由于Swoole的监听类是CLI运行,因此我也非常推荐多写一点echo打印一下状态,在phpstorm的SSH客户端里可以快速的了解目前的情况,就像android-studio的Loger一样。

三)echo Carbon::now() . '/Device Numbers:' . $devNum . PHP_EOL;//老司机劝你多写点,最好packagist找个轮子或者自己写个Logger库


除开本人的一个眉批外,以上摘录自:
文/保安保安(简书作者)
原文链接:http://www.jianshu.com/p/b25e8b46bd02
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

Q:jac***@aliyun.com : 服务器内主要运行程序 : Nginx php-fpm
问题描述 : 最近几天发现我的虚拟vps:101.200.189.210,出现运行时到某个时间点cpu高达100%的问题,连续出现三天了。
强制重启后,一天左右cpu又是100%,ssh都连接不上去,一般出现在早上或晚上6点左右,劳烦看一下是咋回事,能否通过你们系统看到是哪个进程一下子占用了100%的CPU,是一天里有一次左右就让服务器师假死一样,看aliyun的后台说还在运行,但ssh不上去。今天再看看会不会挂吧~  
售后工程师 :  您好:我们查看到您的CPU使用率27日详见附件,这个是需要您在您的实例上去查看的,您查看您的服务器日志,系统日志,查看哪些异常与错误来排查您的异常进程占用CPU,建议您下载使用第三方杀毒软件进行查杀木马病毒,还请您了解。

难道真要进行三方杀毒软件进行查杀木马病毒:
http://www.cnblogs.com/kerrycode/p/4754820.html
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

在目录里叫启动,这个位置放入想开机启动的,如outlook啥的即可。
背景:获取CPU的使用率情况不是很容易一下获取到,用top得到一堆,得写个C来获取。
calccpucmd.c

gcc calccpucmd.c -o calccpucmd
./calccpucmd
20

想获取一下目标机运行时linux系统的硬件占用情况,写了这几个小程序,以后直接用了。
方法就是读取proc下的文件来获取了。 cpu使用率:    /proc/stat ,内存使用情况:      /proc/meminfo
看程序 :

typedef struct PACKED         //定义一个cpu occupy的结构体
{
char name[20];      //定义一个char类型的数组名name有20个元素
unsigned int user; //定义一个无符号的int类型的user
unsigned int nice; //定义一个无符号的int类型的nice
unsigned int system;//定义一个无符号的int类型的system
unsigned int idle; //定义一个无符号的int类型的idle
}CPU_OCCUPY;

typedef struct PACKED         //定义一个mem occupy的结构体
{
char name[20];      //定义一个char类型的数组名name有20个元素
unsigned long total;
char name2[20];
unsigned long free;                      
}MEM_OCCUPY;

get_memoccupy (MEM_OCCUPY *mem) //对无类型get函数含有一个形参结构体类弄的指针O
{
     FILE *fd;        
     int n;            
     char buff[256];  
     MEM_OCCUPY *m;
     m=mem;
                                                                                                              
     fd = fopen ("/proc/meminfo", "r");
      
     fgets (buff, sizeof(buff), fd);
     fgets (buff, sizeof(buff), fd);
     fgets (buff, sizeof(buff), fd);
     fgets (buff, sizeof(buff), fd);
     sscanf (buff, "%s %u %s", m->name, &m->total, m->name2);
    
     fgets (buff, sizeof(buff), fd); //从fd文件中读取长度为buff的字符串再存到起始地址为buff这个空间里
     sscanf (buff, "%s %u", m->name2, &m->free, m->name2);
    
     fclose(fd);     //关闭文件fd
}

int cal_cpuoccupy (CPU_OCCUPY *o, CPU_OCCUPY *n)
{  
     unsigned long od, nd;  
     unsigned long id, sd;
     int cpu_use = 0;  
    
     od = (unsigned long) (o->user + o->nice + o->system +o->idle);//第一次(用户+优先级+系统+空闲)的时间再赋给od
     nd = (unsigned long) (n->user + n->nice + n->system +n->idle);//第二次(用户+优先级+系统+空闲)的时间再赋给od
      
     id = (unsigned long) (n->user - o->user);    //用户第一次和第二次的时间之差再赋给id
     sd = (unsigned long) (n->system - o->system);//系统第一次和第二次的时间之差再赋给sd
     if((nd-od) != 0)
     cpu_use = (int)((sd+id)*10000)/(nd-od); //((用户+系统)乖100)除(第一次和第二次的时间差)再赋给g_cpu_used
     else cpu_use = 0;
     //printf("cpu: %u/n",cpu_use);
     return cpu_use;
}

get_cpuoccupy (CPU_OCCUPY *cpust) //对无类型get函数含有一个形参结构体类弄的指针O
{  
     FILE *fd;        
     int n;          
     char buff[256];
     CPU_OCCUPY *cpu_occupy;
     cpu_occupy=cpust;
                                                                                                              
     fd = fopen ("/proc/stat", "r");
     fgets (buff, sizeof(buff), fd);
    
     sscanf (buff, "%s %u %u %u %u", cpu_occupy->name, &cpu_occupy->user, &cpu_occupy->nice,&cpu_occupy->system, &cpu_occupy->idle);
    
     fclose(fd);    
}

int main()
{
     CPU_OCCUPY cpu_stat1;
     CPU_OCCUPY cpu_stat2;
     MEM_OCCUPY mem_stat;
     int cpu;
    
     //获取内存
     get_memoccupy ((MEM_OCCUPY *)&mem_stat);
    
     //第一次获取cpu使用情况
     get_cpuoccupy((CPU_OCCUPY *)&cpu_stat1);
     sleep(10);
    
     //第二次获取cpu使用情况
     get_cpuoccupy((CPU_OCCUPY *)&cpu_stat2);
    
     //计算cpu使用率
     cpu = cal_cpuoccupy ((CPU_OCCUPY *)&cpu_stat1, (CPU_OCCUPY *)&cpu_stat2);
    
     return 0;
}







我们在搞性能测试的时候,对后台服务器的CPU利用率监控是一个常用的手段。服务器的CPU利用率高,则表明服务器很繁忙。如果前台响应时间越来越大,而后台CPU利用率始终上不去,说明在某个地方有瓶颈了,系统需要调优。这个是即使不懂技术的人都容易理解的事情。

上面理解对吗?我个人觉得不十分准确。这个要看后台你测试的进程是什么类型的。如果是计算密集型的进程,当前端压力越来越大的时候,很容易把CPU 利用率打上去。但是如果是I/O网络密集型的进程,即使客户端的请求越来越多,但是服务器CPU不一定能上去,这个是你要测试的进程的自然属性决定的。比 较常见的就是,大文件频繁读写的cpu开销远小于小文件频繁读写的开销。因为在I/O吞吐量一定时,小文件的读写更加频繁,需要更多的cpu来处理I/O 的中断。

在Linux/Unix下,CPU利用率分为用户态 ,系统态 和空闲态 ,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间。平时所说的CPU利用率是指:CPU执行非系统空闲进程的时间 / CPU总的执行时间 。

在Linux的内核中,有一个全局变量:Jiffies。 Jiffies代表时间。它的单位随硬件平台的不同而不同。系统里定义了一个常数HZ,代表每秒种最小时间间隔的数目。这样jiffies的单位就是 1/HZ。Intel平台jiffies的单位是1/100秒,这就是系统所能分辨的最小时间间隔了。每个CPU时间片,Jiffies都要加1。 CPU的利用率就是用执行用户态+系统态的Jiffies除以总的Jifffies来表示。

在Linux系统中,可以用/proc/stat文件来计算cpu的利用率(详细的解释可参考:http: //www.linuxhowtos.org/System/procstat.htm)。这个文件包含了所有CPU活动的信息,该文件中的所有值都是从 系统启动开始累计到当前时刻。

如:

1.[sailorhzr@builder ~]$ cat /proc/stat  
2.cpu  432661 13295   86656 422145968   171474 233   5346  
3.cpu 0 123075   2462 23494   105543694 16586   0 4615  
4.cpu 1 111917   4124 23858   105503820 69697   123 371  
5.cpu 2 103164   3554 21530   105521167 64032   106 334  
6.cpu 3 94504   3153 17772   105577285 21158   4 24  
7.intr  1065711094 1057275779   92 0   6 6   0 4   0 3527   0 0   0 70   0 20   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   7376958 0   0 0   0 0   0 0   1054602 0   0 0   0 0   0 0   30 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0 0
8.ctxt  19067887  
9.btime  1139187531  
10.processes  270014  
11.procs_running  1  
12.procs_blocked  0    
13.
输出解释
CPU 以及CPU0、CPU1、CPU2、CPU3每行的每个参数意思(以第一行为例)为:


参数

解释


user (432661)
nice (13295)
system (86656)
idle (422145968)
iowait (171474)
irq (233)
softirq (5346)


从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为负进程。1jiffies=0.01秒
从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)
从系统启动开始累计到当前时刻,核心时间(单位:jiffies)
从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)
从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) ,
从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)
从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)

CPU时间=user+system+nice+idle+iowait+irq+softirq
“intr”这行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。

“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。

“btime”给出了从系统启动到现在为止的时间,单位为秒。

“processes (total_forks) 自系统启动以来所创建的任务的个数目。

“procs_running”:当前运行队列的任务的数目。

“procs_blocked”:当前被阻塞的任务的数目。

那么CPU利用率可以使用以下两个方法。先取两个采样点,然后计算其差值:

1.cpu usage=(idle 2 -idle 1 )/(cpu 2 -cpu 1 )* 100  
2.cpu usage=[(user_ 2  +sys_ 2 +nice_ 2 ) - (user_ 1  + sys_ 1 +nice_ 1 )]/(total_ 2  - total_ 1 )* 100
3.
以下用分别用bash和perl做的一个cpu利用率的计算:

本人注:以下代码则采用公式为:

1.total_ 0 USER[ 0 ]+NICE[ 0 ]+SYSTEM[ 0 ]+IDLE[ 0 ]+IOWAIT[ 0 ]+IRQ[ 0 ]+SOFTIRQ[ 0 ]  
2.total_ 1 =USER[ 1 ]+NICE[ 1 ]+SYSTEM[ 1 ]+IDLE[ 1 ]+IOWAIT[ 1 ]+IRQ[ 1 ]+SOFTIRQ[ 1 ]
3.cpu usage=(IDLE[ 0 ]-IDLE[ 1 ]) / (total_ 0 -total_ 1 ) *  100  
4.
###bash 代码
1.CODE: #!/bin/sh  
2.
3.##echo user nice system idle iowait irq softirq  
4.CPULOG_1=$(cat /proc/stat | grep  'cpu '  | awk  '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}' )
5.SYS_IDLE_1=$(echo  $CPULOG_1  | awk  '{print $4}' )  
6.Total_1=$(echo  $CPULOG_1  | awk  '{print $1+$2+$3+$4+$5+$6+$7}' )  
7.
8.sleep 5  
9.
10.CPULOG_2=$(cat /proc/stat | grep  'cpu '  | awk  '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}' )
11.SYS_IDLE_2=$(echo  $CPULOG_2  | awk  '{print $4}' )  
12.Total_2=$(echo  $CPULOG_2  | awk  '{print $1+$2+$3+$4+$5+$6+$7}' )  
13.
14.SYS_IDLE=`expr  $SYS_IDLE_2  -  $SYS_IDLE_1 `  
15.
16.Total=`expr  $Total_2  -  $Total_1 `  
17.SYS_USAGE=`expr  $SYS_IDLE / $Total *100 |bc -l`  
18.
19.SYS_Rate=`expr 100- $SYS_USAGE  |bc -l`  
20.
21.Disp_SYS_Rate=`expr  "scale=3; $SYS_Rate/1"  |bc`  
22.echo  $Disp_SYS_Rate %  
23.
24.  
###perl 代码
1.#!/usr/bin/perl  
2.
3.use warnings;  
4.
5.$SLEEPTIME =5;  
6.
7.if  (-e  "/tmp/stat" ) {  
8.unlink  "/tmp/stat" ;  
9.}  
10.open (JIFF_TMP,  ">>/tmp/stat" ) || die  "Can't open /proc/stat file!/n" ;  
11.open (JIFF,  "/proc/stat" ) || die  "Can't open /proc/stat file!/n" ;  
12.@jiff_0 =<JIFF>;  
13.print JIFF_TMP  $jiff_0 [0] ;  
14.close (JIFF);  
15.
16.sleep  $SLEEPTIME ;  
17.
18.open (JIFF,  "/proc/stat" ) || die  "Can't open /proc/stat file!/n" ;  
19.@jiff_1 =<JIFF>;  
20.print JIFF_TMP  $jiff_1 [0];  
21.close (JIFF);  
22.close (JIFF_TMP);  
23.
24.@USER =`awk  '{print /$2}'   "/tmp/stat" `;  
25.@NICE =`awk  '{print /$3}'   "/tmp/stat" `;  
26.@SYSTEM =`awk  '{print /$4}'   "/tmp/stat" `;  
27.@IDLE =`awk  '{print /$5}'   "/tmp/stat" `;  
28.@IOWAIT =`awk  '{print /$6}'   "/tmp/stat" `;  
29.@IRQ =`awk  '{print /$7}'   "/tmp/stat" `;  
30.@SOFTIRQ =`awk  '{print /$8}'   "/tmp/stat" `;  
31.
32.$JIFF_0 = $USER [0]+ $NICE [0]+ $SYSTEM [0]+ $IDLE [0]+ $I
对于数量于质量来讲,就像打篮球,如果数量不够,那么质量肯定不行,
但在追求数量的同时,不要太偏向数量,举例:投了1000个球,但一个球没有进,这样反而会影响了后期的质量。
也就是说在质量面前,数量是一定要有的,这是前提,如果数量不够,投出来的质量可能并不是特别好或不稳定。
也就是数量和质量是相互关系的,

但是它们又是分开的,如果没有数量的积累,那么就和质量就无关了。
但是它们又是统一的,如果在数量的同时,也追求了进球的成功概率,那么离成功就不选 了。
数量是前提,在数量的基础上进行不段调整修正,投球的角度和抛物线,提高进球稳定性,那么质量就在这个过程中给加强 了。
但数量是必须的,如果没有一定的数量积累,那么对于基本功是没法练成的,比如手臂力的练成及方向稳定性的修正正是在数量下进行累计的,手脑并用,数量是必须的,是研究任何事物的起码,通俗点说是通过多做题目,多投篮,在做的过程中领悟,在数量 里练习并悟道,正是快速认识事物研究学习的一般规律。---jackX
git clone https://github.com/dufferzafar/netuse /usr/local/netuse
cd /usr/local/netuse
cp config.py.example config.py
ln -s netuse.py /usr/bin/netuse

Crontab:



vi /usr/bin/netuse
#!/usr/bin/python3  
不存在python3怎么办?
ln -s /usr/bin/python /usr/bin/python3


vi /usr/local/netuse/dumper 把网卡修改成自己的网卡eth1:
# which registers itself as a ppp device.
echo $(cat /sys/class/net/ppp0/statistics/rx_bytes)";"$(date +%s) >> ~/.net/$year/$month/down/$date                                                          
echo $(cat /sys/class/net/ppp0/statistics/tx_bytes)";"$(date +%s) >> ~/.net/$year/$month/up/$date
修改为:

修改为:eth1


标准统计(主要看看vps一天多少流量):
[root@iZ25z0ugwgtZ netuse]# netuse
Downloaded:        5 MB
Uploaded:          0 MB

Data Left:      10235 MB
Days Left:         3 Days
End Date:       2016-06-29 (11:59 PM)

Suggested:      3411 MB (Per Day)

一周一瞥(好像有点问题):
[root@iZ25z0ugwgtZ netuse]# netuse -w
Data downloaded this week:

Traceback (most recent call last):
  File "/bin/netuse", line 277, in <module>
    weekly()
  File "/bin/netuse", line 186, in weekly
    format="{:>5.0f}",
  File "/usr/local/netuse/termgraph.py", line 56, in chart
    print_blocks(labels[i], data[i], step, args)
  File "/usr/local/netuse/termgraph.py", line 63, in print_blocks
    blocks = int(count / step)
ZeroDivisionError: integer division or modulo by zero
背景:在windows下提交了一个git更新,想在linux下强制更新(这个linux下的文件也被我改动了),以windows下提交的为准怎么办?还会出错,如下:
Git pull 强制覆盖本地文件,与在git bash下实践OK,AddTime:2016-9-29

来自:http://blog.csdn.net/baple/article/details/49872765


一)出错:
新增文件add commit后,push回原分支失败,报错:
  Counting objects: 20, done.
  Delta compression using up to 24 threads.
  Compressing objects: 100% (11/11), done.
  Writing objects: 100% (11/11), 1.30 KiB, done.
  Total 11 (delta 5), reused 0 (delta 0)
  error: insufficient permission for adding an object to repository database ./objects


二)git本地有修改如何强制更新到远程:
本地有修改和提交,如何强制用远程的库更新更新。我尝试过用git pull -f,总是提示 You have not concluded your merge. (MERGE_HEAD exists)。
我需要放弃本地的修改,用远程的库的内容就可以,应该如何做?傻傻地办法就是用心的目录重新clone一个,正确的做法是什么?

正确的做法应该是:
git fetch --all
git reset --hard origin/master
git fetch 只是下载远程的库的内容,不做任何的合并git reset 把HEAD指向刚刚下载的最新的版本

参考链接:

http://stackoverflow.com/questions/1125968/force-git-to-overwrite-local-files-on-pull
背景:对chkconfig还没用熟悉又来了一个新的。
rpm -qf  /usr/bin/systemctl
systemd-219-19.el7_2.11.x86_64

yum remove systemd-219-19.el7_2.11  -y
错误:尝试移除受保护的 "systemd",为嘛不让卸载??



我们对service和chkconfig两个命令都不陌生,systemctl 是管制服务的主要工具, 它整合了chkconfig 与 service功能于一体。

systemctl is-enabled iptables.service
systemctl is-enabled servicename.service #查询服务是否开机启动
systemctl enable vsftpd.service #开机运行服务
systemctl disable vsftpd.service #取消开机运行
systemctl start vsftpd.service #启动服务
systemctl stop vsftpd.service #停止服务
systemctl restart vsftpd.service #重启服务
systemctl reload vsftpd.service #重新加载服务配置文件
systemctl status vsftpd.service #查询服务运行状态
systemctl --failed #显示启动失败的服务

注:*代表某个服务的名字,如http的服务名为httpd


例如在CentOS 7 上安装http

[root@CentOS7 ~]# yum -y install httpd
启动服务(等同于service httpd start)
systemctl start httpd.service
停止服务(等同于service httpd stop)
systemctl stop httpd.service
重启服务(等同于service httpd restart)
systemctl restart httpd.service
查看服务是否运行(等同于service httpd status)
systemctl status httpd.service
开机自启动服务(等同于chkconfig httpd on)
systemctl enable httpd.service
开机时禁用服务(等同于chkconfig httpd on)
systemctl disable httpd.service
查看服务是否开机启动 (等同于chkconfig --list)

来自:http://www.linuxidc.com/Linux/2014-11/109236.htm
引子:目前做Mysql的中间件很多,做网站缺了东西就缺了,但不缺太多就成,所以易地备份还是有它的意义,Mysql这块MHA能在心理上有一定安慰,而真是要真金白银来讲,这种做法也是很难以让人信服,听群里兄弟提起关于银行这块的一些实践基本上是不敢切的,MHA Manager可以单独部署在一台独立机器上管理多个master-slave集群,也可以部署在一台slave上。MHA Manager探测集群的node节点,当发现master出现故障的时它可以自动将具有最新数据的slave提升为新的master,然后将所有其它的slave导向新的master上。整个故障转移过程对应用程序是透明的。对于银行来说最新数据的slave, 也可能不完整呀,容灾只是为了备份,所以业务数据完整性重要的话,异地热切换这种事情想想就好了,工行当年升级db2所有业务挂了一整天都没敢切异地,他们号称技术上实现了异地热切换的国内四大行都有这个最后真出问题谁都不敢切。我问:比如uber这样的,出了问题,岂不是一天不打车了?宇宙行一整天没办业务,uber算啥,异地容灾.除非强数据同步.不然都可能会丢失数据.MHA这东西成本很高的,对于我们来说,做好备份就行了,冷备,热备,主从复制。rsync,mysqldump备份,物理文件备份,主从复制。差不多就行了,rsync我主要用于备份git,而mysqldump啥的主要用来备份mysql到不同机器。
阅读全文
内存不够的问题会很多:
1) 涉及到编译msyql啥的,会导致内存不够:
http://jackxiang.com/post/8677/
2)买的vps本来内存就小:
http://jackxiang.com/post/8529/
———————————————————————
怀疑Linux上某些进程有内存泄漏,怎么看?

vmstat 1  看下si so,如果长期是0,就不用管了:
(看说明都是vmstat查出来的swpd代表swap的使用量,si、so表示交换分区和内存的写入、写出的量)


[root@iZ25z0ugwgtZ config]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  1 494088  33764    220 457276  904  731  1106   737  245  540  1  0 93  6  0

si  每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。
so  每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

《深入理解linux内核》,很薄的一本,里面有详细说明。。。
背景:在centos7下安装gitlab时需要这个库,为此,先作个记录。
EPEL 是yum的一个软件源,里面包含了许多基本源里没有的软件了,但在我们在使用epel时是需要安装它才可以了,下文来介绍CentOS7/RHEL7安装EPEL步骤

EPEL,即Extra Packages for Enterprise Linux的简称,是为企业级Linux提供的一组高质量的额外软件包,包括但不限于Red Hat Enterprise Linux (RHEL), CentOS and Scientific Linux (SL), Oracle Enterprise Linux (OEL)。(关于 : EPEL)
为CentOS7/RHEL7安装EPEL 仓库(repo)
方法一:命令安装

[root@idoseek ~]# yum -y install epel-release
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.unifiedlayer.com
* extras: mirrors.kernel.org
* updates: mirrors.syringanetworks.net
正在解决依赖关系
--> 正在检查事务
---> 软件包 epel-release.noarch.0.7-2 将被 安装
--> 解决依赖关系完成

依赖关系解决

====================================================================================================
Package                     架构                  版本                 源                     大小
====================================================================================================
正在安装:
epel-release                noarch                7-2                  extras                 13 k

事务概要
====================================================================================================
安装  1 软件包

总下载量:13 k
安装大小:22 k
Downloading packages:
epel-release-7-2.noarch.rpm                                                  |  13 kB  00:00:00    
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安装    : epel-release-7-2.noarch                                                         1/1
  验证中      : epel-release-7-2.noarch                                                         1/1

已安装:
  epel-release.noarch 0:7-2                                                                        

完毕!
[root@idoseek ~]#
方法二:手动安装
针对系统架构选择相应的类型:http://dl.fedoraproject.org/pub/epel/7/。我们使用的x86_64,就要进入该目录下寻找相应包,安装方法如下:

# rpm -vih http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-2.noarch.rpm
或者:

# wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-2.noarch.rpm
# rpm -vih epel-release-7-2.noarch.rpm
更新包缓存
此时我们发现/etc/yum.repos.d/下多了两个epel的repo文件:

[root@idoseek ~]# ll /etc/yum.repos.d/
总用量 28
-rw-r--r-- 1 root root 1664 8月  22 12:21 CentOS-Base.repo
-rw-r--r-- 1 root root  649 8月  22 12:21 CentOS-Debuginfo.repo
-rw-r--r-- 1 root root  290 8月  22 12:21 CentOS-fasttrack.repo
-rw-r--r-- 1 root root 1331 8月  22 12:21 CentOS-Sources.repo
-rw-r--r-- 1 root root  156 8月  22 12:21 CentOS-Vault.repo
-rw-r--r-- 1 root root  957 9月   2 12:14 epel.repo
-rw-r--r-- 1 root root 1056 9月   2 12:14 epel-testing.repo
更新元数据缓存:
[root@idoseek ~]# yum clean all && yum makecache

来自:http://www.111cn.net/sys/CentOS/85450.htm
背景:对于死锁的问题,人们往往想到出现一些关于访问很缓慢,有白页现象,要是测试环境(我就真实遇到测试环境有本文谈及一样的问题)你也就重启一下PHP的php-fpm进程发现又好了,隔一段时间又出类似的问题,你会看下日志,你会发现有很多日志是“Max execution timeout of 60 seconds exceeded”,你会发现这可能是一些php的守护进程导致的,你为了解决测试环境的问题,于是觉得应该把那个php-fpm的进程数开多点,可能会好一些,于是你开多了,一直没有面对这个问题的原因,为什么呢,因为公司装PHP的是运维装的,你没有办法或时间去装一个debug版本的php,你说这个问题让运维的人来查,你觉得能查出来?So,这个问题一拖再拖,但就是没解决,但是有一天你发现磁盘满了,用du去看整体时发现满了,但是如果一个个目录去看发现并没有占用多少,也万万没有想到PHP的死锁还会导致磁盘空间占用太多,上面这种情况我就真实遇到过,后来重新reboot操作系统,磁盘又回来了,所以,我认为是一篇好文章,所以转了此文,也想说明对于PHP的扩展这方面代码质量把关需要严格,再就是PHP本身关于锁这块要弱化(除开cookie/session和cache锁外,其它能不用就不用),尽可能少用锁,这是博主一点小看法,同时把那些比如发短信啥的能异步的给用swoole异步了(这儿有点广告嫌疑),解放出php-fpm进程,防止因为阻塞导致hold住了PHP的php-fpm进程,像php下面的队列demon这种,能单独放就单独放一台机器隔离开,减少出现错误和问题的各种猜忌影响判断,下面言归正传。


引子:
本期我们邀请到了 云盘服务端 团队的技术达人- 徐铁成,一个隐蔽已久的PHP死锁问题被层层掘出,感谢铁成为我们带来这次畅快的体验,小伙伴们,准备好这次技术之旅了么?
---------------
发现问题
近期发现线上很多机器的磁盘空间报警, 且日志文件已经清理,但是磁盘空间没有释放。通过ps aux | grep php-cgi 发现, 很多进程的启动时间在几天到几周甚至几个月之前。我们线上的php-cgi都有最大执行次数的。一般在1天内都会重启一次。初步结论,这些cgi进程有问题。
通过lsof -p [pid] 发现, 启动时间很久的cgi进程中打开了一些日志文件句柄,并且没有关闭。这些日志文件在文件系统中已经删除了。但是句柄没关闭,导致磁盘空间没有释放。到此,磁盘空间异常的问题基本确定。是由于cgi没有关闭文件句柄造成的。
进一步分析进程, strace -p [pid], 发现所有异常的进程都阻塞与 fmutex 状态。换句话所,异常的cgi进程死锁了。进程死锁导致打开的文件句柄没有关闭,所以导致磁盘空间异常。

为什么cgi进程会死锁呢?

什么是死锁
学过操作系统的通同学,都了解多线程的概念。在多线程中访问公共资源,需要对资源加锁。访问结束后,释放锁。如果没有释放锁,那么下一个线程来获取资源的时候就会永远都无法获取资源的锁,于是这个线程死锁了。那么CGI是多线程的公共资源访问导致的死锁吗? 答案是NO。
1. CGI 是单线程进程,通过ps 就能看到。(进程状态 Sl的才是多线程进程)。
2. 即使是多线程的,死锁发生在PHP的shutdown过程中调用glibc 中time 函数的位置,不是php模块造成的。而glibc 中的time相关函数是线程安全的,不会产生死锁。

那是什么导致的死锁呢?
通过分析linux中死锁产生的机制,发现除了多线程会产生死锁外,信号处理函数同样会产生死锁。那么cgi是由于信号处理导致的死锁吗?在这之前介绍一个感念。

函数的可重入性与信号安全
函数可重入是指,无论第几次进入该函数,函数都能正常执行并返回结果。那么线程安全函数是可重入的吗?答案是NO。 线程安全函数,在第一次访问公共资源时,会获取全局锁。如果函数没有执行完成,锁还没释放,此时进程被中断。那么在中断处理函数中,再次访问该函数,就会产生死锁。那么什么样的函数才可以在中断处理函数中访问呢? 除了没有使用全局锁的函数,还有一些signal safe的系统调用可以使用。调用任何其他的非signal safe的函数都会产生不可预知的后果(比如 死锁)。 详见 man signal。在分析死锁的原因前,我们先看看cgi执行的流程,分析其中有没有产生死锁的可能。

PHP-CGI的执行流程
Glibc中的时间函数使用到了全局锁,保证函数的线程安全,但没有保证信号安全(signal safe)。经过之前的分析,我们初步怀疑死锁是由于PHP-CGI进程接收到了一个信号,然后在signal handle中执行了非signal safe的函数。主流程在中断前,正在执行glibc中的时间函数。在函数获取的锁没释放前,进入中断流程。而中断过程中又访问了glibc中的时间函数。于是导致了死锁。
PHP-CGI的执行流程,如下图所示:
点击在新窗口中浏览此图片
进一步分析发现,所有死锁的cgi进程的sapi_global中都记录了一个错误信息
“Max execution timeout of 60 seconds exceeded”.
60s 是我们php-cgi中设置执行超时。所以我们确认了,cig在执行过程中的确产生了超时异常,然后由于longjmp进入了shutdown过程。在shutdown过程中访问了glibc中的时间函数。导致了死锁。
void zend_set_timeout(long seconds)
{
TSRMLS_FETCH();

EG(timeout_seconds) = seconds;
if(!seconds) {
return;
}
……

setitimer(ITIMER_PROF, &t_r, NULL);
signal(SIGPROF, zend_timeout); // 此处会调用zend异常处理函数
sigemptyset(&sigset);
sigaddset(&sigset, SIGPROF);

……
}
通过gdb调试发现,所有PHP-CGI都阻塞在zend_request_shutdown中。zend_request_shutdown会调用用户自定义的php脚本中实现的shutdown函数。如果CGI执行超市,那么定时器会产生SIGPROF信号使执行流程中断。如果此时脚本刚好处于调用时间函数的状态,且还没有释放锁资源。然后执行流程进入了 timeout 函数,继续跳转到zend_request_shutdown。此时如果自定义的shutdown函数中访问了时间函数。就会产生死锁。我们从代码中找到了证据:
register_shutdown_function ('SimpleWebSvc:: shutdown’);
我们在php代码中使用qalarm系统,qalarm系统会在cgi执行结束(shutdown)的时候,注入一个钩子函数,来分析cgi执行是否正常,如果不正常,则发送报警信息。而刚好qalarm的报警处理函数中访问了时间函数。于是就有一定的概率产生死锁。

结论
通过上面的分析,我们找到了cgi死锁产生的原因,是应为在signal handler中使用了非signal safe的函数,导致了死锁。

解决办法
去掉或简化qalarm注册到shutdown中的钩子函数。避免不安全的函数调用。

来自:http://www.v2gg.com/lady/shishangzixun/20140924/57266.html
每天早上2-3小时shell论坛,今天终于把精华帖子恳完了,放点好脚本给各位,学shell上cu,没事逛逛论坛,心情好的时候看看精华贴.进步那真是飞一般的感觉.
不过新手最好还是先潜水一个月,在开始发帖回帖.最近论坛帖子质量严重下降都是1+1=?.
zj@zj:~/Script/cushell/08.11.04$ cat checkip.sh

解释下:
grep -Eq '[^0-9.]|^\.|\.$|^0*\.|\.\.'
[^0-9.]是不是有除了0-9与.之外的字符
^\.|\.$  以.开头 or 以.结尾
^0*\.|\.\. 以0开头 or 连续两个.
以上三种情况都是错误的哦,所以就printerr

echo -e "${IP//./\n}" | wc -l说实话前面那种替换我也是first time.就是讲.替换为换行,3个点就是4行了哦.不是3个点也就printerr

$((10#$i/8)) -gt 31 这个就是判断是不是<=255的了,当然你也可以自己修改成$i -gt 255

OK解释完毕^_^
zj@zj:~/Script/cushell/08.11.04$ ./checkip.sh 1.2.3.4
1.2.3.4 is
zj@zj:~/Script/cushell/08.11.04$ ./checkip.sh 01.2.3.4
incorrect IP format.
Your IP: a.b.a.d
incorrect IP format.
Your IP: 266.1.1.1
incorrect IP format.
Your IP: 244.255.255.255
244.255.255.255 is

来自:http://blog.chinaunix.net/uid-9950859-id-98351.html
更复杂的且更精确的判断:http://www.shangxueba.com/jingyan/1898546.html
Swoole在实际项目中的应用
[PHPer]Swoole在实际项目中的应用(不讲入门,只有实战)
2016年6月18日 13:30 ~ 2016年6月18日 17:00
(北京海淀)中关村海龙大厦办公楼17层(星巴克咖啡北侧办公大厅入口)
限额100人
本次活动由Swoole框架内核开发者王晶(网名半桶水,人称桶哥)发起,由优才学院、内聘网联合主办。
[活动对象]
本次活动针不讲入门只讲实战,我们希望你:
1、PHPer,一年以上
2、对Swoole了解或者应用过
3、对开源项目感兴趣,并持续关注开源项目

发起当天就有70多人参加,欢迎你的加入。


报名链接:
http://www.huodongxing.com/event/5337738177600

win:
findstr /s /i /n /d:D:\ "hahaha" *.txt //寻找D盘下所有包含hahaha的txt文件

linux:
find /var/www -name "*.*" | xargs grep "pass" //从www目录开始查找所有包含pass的文件
背景:有时候出现句柄数不够用的情况,得用awk去统计一下各个进程的句柄数之和是否超过设置的句柄数了,cat /tmp/runProNumFds.txt | awk '{a=a+$1}END{print a}' ,这样好再次重新设置一下句柄的值。
ulimit -n
65535

----查看当前进程打开了多少句柄数

# lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more


压力测试时一看这些句柄数的一个情况,如下:
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr
1063 23973
1030 23975
739 23972
522 23971
139 64672
136 3569
136 3568
136 3454
136 3450
136 3449


lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr >> /tmp/runProNumFds.txt
简单的把第1列加起来:
cat /tmp/runProNumFds.txt | awk '{a=a+$1}END{print a}'
47465
Awk求和参考自:http://blog.sina.com.cn/s/blog_710844930100pzxj.html

ps aux|grep -E "23975|23972|23973|64672"
root      4374  0.0  0.0 103316   880 pts/1    S+   17:25   0:00 grep -E 23975|23972|23973|64672
www      23972  2.2  0.1  65656 22788 ?        S    15:09   3:00 nginx: worker process                                          
www      23973  3.1  0.1  65656 22784 ?        S    15:09   4:16 nginx: worker process                                          
www      23975  1.9  0.1  65656 22780 ?        S    15:09   2:39 nginx: worker process                                          
root     64672  0.3  0.0 576792  6536 ?        Ss   17:09   0:03 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)  
============================================================================


背景:做一些大量的句柄打开的操作,很有必要看到底打开了多少。如inodity监控啥的。
[root@mongodb11 ~]# ulimit -a
                     ......
open files                      (-n) 1024
                     ......


----查看当前进程打开了多少句柄数
# lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
131 24204 
57 24244  
57 24231   ........
其中第一列是打开的句柄数,第二列是进程ID。





---查看系统默认的最大文件句柄数,系统默认是1024

# ulimit -n

1024



----查看当前进程打开了多少句柄数

# lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more

131 24204 

57 24244  

57 24231   ........

其中第一列是打开的句柄数,第二列是进程ID。

可以根据ID号来查看进程名。

# ps aef|grep 24204

nginx  24204 24162 99 16:15 ?    00:24:25 /usr/local/nginx/sbin/nginx -s



Linux有硬性限制和软性限制。可以通过ulimit来设定这两个参数。方法如下,以root用户运行以下命令:

# ulimit -HSn 4096

以上命令中,H指定了硬性大小,S指定了软性大小,n表示设定单个进程最大的打开文件句柄数量。个人觉得最好不要超过4096,毕竟打开的文件句柄数越多响应时间肯定会越慢。设定句柄数量后,系统重启后,又会恢复默认值。如果想永久保存下来,可以修改.bash_profile文件,可以修改 /etc/profile 把上面命令加到最后.

原文:http://leequery.blog.163.com/blog/static/1684220962010101023743567/

更多:http://liuzhigong.blog.163.com/blog/static/1782723752013817916611/
背景:我都之前说php7对wordpress提升不大,没有一个兄弟支持我,都说提升大,你看这文章,qq会员那边的一个实践更多证实了我的观点。

                                                                               ......
在benchmark(测试程序)中得到非常好的结果,实现JIT后性能比PHP5.5提升了8倍。然而,当他们把这个优化放入到实际的项目WordPress(一个开源博客项目)中,却几乎看不见性能的提升。原因在于测试项目的代码量比较少,通过JIT产生的机器码也不大,而真实的WordPress项目生成的机器码太大,引起CPU缓存命中率下降(CPU Cache Miss)。
                                                                               ......

对apache的工作模式分析很透彻:
Prefork、Worker、Event三者粗略介绍:

(1)prefork,多进程模式,1个进程服务于1个用户请求,成本比较高。但是,稳定性最高,不需要支持线程安全。
(2)worker,多进程多线程模式,1个进程含有多个worker线程,1个worker线程服务于1个用户请求,因为线程更轻量,成本比较低。但是,在KeepAlive场景下,worker资源会被client占据,无法响应其他请求(空等待)。
(3)event,多进程多线程模式,1个进程也含有多个worker线程,1个worker线程服务于1个用户请求。但是,它解决了KeepAlive场景下的worker线程被占据问题,它通过专门的线程来管理这些KeepAlive连接,然后再分配“工作”给具体处理的worker,工作worker不会因为KeepAlive而导致空等待。

博文摘自 : http://geek.csdn.net/news/detail/77849
背景:先升级wordpress最新版本,WP到最新的4.5.2版本。,再修改/etc/ImageMagick/policy.xml里修改配置文件屏蔽,官方给予的方法,禁止ImageMagick即可。

如果我们有关注服务器、网站安全方面信息的肯定在上周有看到关于ImageMagick安全漏洞的相关文章,如果我们的服务器、VPS是自己运维的那就需要注意这方面的问题。如果我们的WEB环境有安装过ImageMagick组件,那需要检查是否有漏洞的存在一起升级和解决问题。

同时,上午肯定很多网友有得到阿里云服务器安全提示,存放在上面的WordPress程序有WP_Image_Editor_Imagick漏洞问题,需要登入后台补丁等等的暗示。如果需要在线补丁则需要升级阿里云的骑士专业版,当然是需要收费的,其实我们即便要补丁安全也没有必要这样操作。因为这个WP_Image_Editor_Imagick漏洞本不是WP程序的,而是如果我们服务器环境中有安装ImageMagick且没有补丁的才会被利用。

第一、检查是否有ImageMagick漏洞

实践如下:
yum install ImageMagick  
[root@iZ25dcp92ckZ htdocs]# convert 'https://jackxiang.com"|ls "-la' OUT.png      
convert: not authorized `//jackxiang.com"|ls "-la' @ error/constitute.c/ReadImage/454.
convert: no images defined `OUT.png' @ error/convert.c/ConvertImageCommand/3046.

被我屏蔽了。

如果提示有执行成功且没有错误,则说明有漏洞,我们需要升级组件。如果提示错误,或者我们压根没有安装ImageMagick,那就没有问题。

第二、补丁WP_Image_Editor_Imagick

如果是自己架设的服务器,且有安装ImageMagick存在漏洞最好的方法是升级最新版本。临时解决WP漏洞的方法只需要修改一行代码就可以。

1、找到wp-includes/media.php 2898行

2、修改文件

$implementations = apply_filters( 'wp_image_editors', array( 'WP_Image_Editor_GD', 'WP_Image_Editor_Imagick' ) );
将2个库优先级对调就可以了。这样我们在阿里云后台再验证下就可以看到被修复。

总结,这个仅仅是临时解决方法,最为直接的方法还是要升级WP到最新版本,以及ImageMagick如果有安装则需要升级。

PS:补充信息

如果我们是虚拟主机,这个就需要主机提供商负责任了,咨询服务商是否有安装且是否有更新到最新版本的补丁。如果有安装ImageMagick且升级到最新版本一般是没有问题的。这里,根据官方提供的解决方法,如果我们是自建服务器,也可以通过这个方法解决。

1、修改配置文件

/etc/ImageMagick/policy.xml
2、添加脚本


这个官方给予的方法,禁止ImageMagick。

来自:https://wuzhuti.cn/1339.html
win10下很多软件的拖拽功能都失效了,也就是说不能把文件拖动到软件上直接打开,必须要用软件里的打开功能,这是非常麻烦的。经过几天搜索在网上找到了一个折中的方法,有着鱼和熊掌不能兼得的可惜。
    运行中输入regedit,打开注册表编辑器
    在下面的键值:
    HKEY_LOCAL_MACHINE > SOFTWARE > Microsoft > Windows > CurrentVersion > Policies > System
    找到EnableLUA将1改成0,然后重启。
win10drag
    重启后会发现拖拽问题正常了,但是win10自带的商店和浏览器Edge将不能打开,这可能是权限问题。

来自:http://lf.lnu.edu.cn/detail.jsp?id=42172
origin 是默认的远程版本库名称
你可以在 .git/config 之中进行修改

事实上 git push origin master 的意思是 git push origin master:master (将本地的 master 分支推送至远端的 master 分支,如果没有就新建一个)
分页: 14/248 第一页 上页 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 下页 最后页 [ 显示模式: 摘要 | 列表 ]