背景:想搭建一个Gitlab的两台机器进行都访问NAS网盘作为数据共享,而这样的好处是网盘内容是一致的,达到高可用,而同时对这个NAS网盘进行Git命令备份,防止网盘挂了,也能恢复,也是代码数据的高可用。
在阿里云上也申请了一个类似的NFS磁盘,但是挂载时是ROOT权限,我那个/home/git/.ssh想是git权限,于是提起工单:




售后工程师 :    您好,这样不支持,mount后的目录权限有ans服务端决定,目前不支持修改。  
2017-07-06 23:42:54
售后工程师 :    您好,技术反馈这个是nas服务端决定的,目前我方设置的权限是777 root:root  

经实践:
mkdir -p /home/git/mnt
ll  -d /home/git/mnt/
drwxr-xr-x 2 root root 4096 Jul  8 23:52 /home/git/mnt/  #Linux root用户id号是0
挂载NFS:
mount -t nfs -o vers=3,tcp 10.71.15.98:/Vol-01/backup /home/git/mnt
ll  -d /home/git/mnt/
drwxr-xr-x 11 1000 1000 114688 Jun 11 20:04 /home/git/mnt/
变成1000了,这个值是NFS服务端设置的,但是阿里云是0,也就不是Git账户的ID了。它是0,root用户id号是0,不敢该RootID值为非0值。

推测其配置如下:
打开/etc/exports文件,在末尾加入:
/home/kevin *(rw,sync,no_root_squash)
注:nfs允许挂载的目录及权限,在文件/etc/exports中进行定义,各字段含义如下:
/home/kevin:要共享的目录
* :允许所有的网段访问
rw :读写权限
sync:资料同步写入内在和硬盘
no_root_squash:nfs客户端共享目录使用者权限


nfs中exports中no_root_squash的意义:
no_root_squash:登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限!这个项目『极不安全』,不建议使用!
root_squash:在登入 NFS 主机使用分享之目录的使用者如果是 root 时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody 那个系统账号的身份。

增加no_root_squash可以轻松获得NFS主机共享目录读写权限.
=================================================================================
在文章后面有讲如何搭建NFS服务器:http://jackxiang.com/post/8299/
阅读全文
http://my.oschina.net/u/2340880/blog/508688
Crack:
http://download.csdn.net/download/xieyupeng520/9342987

http://www.sd173.com/html/3774.html
背景:阿里私有云呐,出现Agent异常,查各种配置均没有问题,后把EDAS的agent服务器均重启了又好了(重启6台中的一台还是有问题),东软哥们问阿里说是给他来了句,叫什么地址漂移,不知道什么鬼高科技。查一下了解了解。

   采用地址漂移技术,利用虚拟IP地址来绑定主服务器,可有效解决不能利用组播的情况下,多台服务器集群之间的信息交互问题。此方法具有一定的代表性,在很多行业可以采用。  双机集群方式广泛应用于各级航空飞行管制中心,两台中心服务器通过网络构成一套高可靠性双机热备份系统,同步工作、互为备份,当主机发生故障时,自动切换到备机工作,系统不间断运行。而地址漂移技术是当其中一台主机有故障时,另一主机接管故障主机的网络IP地址,使网络仍能正常运行。
三是采用地址漂移技术,给管制中心分配一个航空管制中心虚拟IP 地址,航空管制中心之间传递情报采用此IP地址,然后由各航空管制中心的主服务器与此IP地址绑定,负责接收和发送情报。同时在主服务器启动一个三通进 程,所谓三通进程是指此进程负责接收信息,然后将收到的信息分别转发到集群内两台服务器,类似于水龙头的三通,因此称之为三通进程。主服务器收到一份情报 后,送往局域网内主服务器和备服务器的接收进程。当主机切换为备机时,此服务器卸载此虚拟IP地址,切换为主机的服务器加载虚拟IP地址,并启用三通进程 负责接收和分发情报。虚拟IP地址在主备服务器之间漂移,也称之为地址漂移技术,目前很多集群软件也采用此技术来解决集群内多台计算机只有惟一IP地址的 问题。
文中有说ARP+Socket实现的。详情如下:

阅读全文
背景:如果一个文件目录很大且需要定时同步,怎么办,linux下有一个rsync,同步到的可能是本地,更多是同步到把nas给mount上来的一个网络超大磁盘,这就很有用了。

rsync -avh #备注:只是增量同步,远端有不一样的文件,它不会自动删除。
rsync -avh --delete gliethttp/ /media/udisk/gliethttp
其中gliethttp/为src这里的结尾/很重要,这表示同步的是gliethttp/目录中的内容,而不是gliethttp目录本身.
/media/udisk/gliethttp为dst
表示将src中的内容与dst进行严格同步,如果dst不存在,那么创建之.
-r 表示递归目录
-t 表示保留时间
-l 表示保留符号链接

我们也可以使用ssh辅助rsync远程同步文件夹
luther@gliethttp:~$ rsync -avh --delete luther@127.0.0.1:/media/udisk/gliethttp/ gliethttp.local
默认使用ssh远程登录luther用户,然后使用ssh加密通道进行数据传输,同步/media/udisk/gliethttp/文件夹中的内容到本地的gliethttp.local目录下

网上有通过配置/etc/rsyncd.conf来设置访问权限,个人感觉很不安全,远远不如使用成熟的ssh进行数据加密,对于用户认证,可以将生成的.ssh对应的key发布出去,这样就不用每次输入密码了[luther.gliethttp]
《windows登陆远程Linux主机的一种途径putty-详细安装使用过程》
下面看看如何创建key
1. luther@gliethttp:~$ ssh-keygen -t rsa
2. 将~/.ssh/id_rsa.pub改名为/root/.ssh/authorized_keys
3. 将私钥~/.ssh/id_rsa拷贝到远程客户端的~/.ssh/目录下
当然可以安装rsync的GUI版本grsync
luther@gliethttp:~$ sudo apt-get install grsync

来自:http://blog.chinaunix.net/uid-20564848-id-74200.html
背景:删除文件时吧 /root/ 里面的文件删除了.过程如下:
[root@localhost x86_64]# ll
total 534136
-rwxr-xr-x 1 www  www    6227876 May  4 13:45 amoeba-2.1.0-160504134426.el6.x86_64.rpm
-rwxr-xr-x 1 www  www     149892 Apr 26 18:11 apcu-php56-4.0.11-160426181109.el6.x86_64.rpm
-rwxr-xr-x 1 www  www     114160 May  5 11:12 apcu-php70-5.1.3-160505111247.el6.x86_64.rpm
-rwxr-xr-x 1 www  www   25338712 May 27 15:40 berkeleydb-6.2.23-160527153833.el6.x86_64.rpm
-rwxr-xr-x 1 www  www   27203008 Jun 23 14:57 elasticsearch-2.3.3-160623145745.el6.noarch.rpm
drwx------ 3 root root      4096 Jul 15 15:20 $HOME

rm -Rf '$HOME'

[root@localhost x86_64]# rm -Rf $HOME
[root@localhost x86_64]# echo $HOME
/root
[root@localhost /]# ls /root
ls: cannot access /root: No such file or directory

cd /data/www/yum/centos/7/x86_64
rm -Rf usr
rm -Rf lib
rm -Rf lib64
rm -Rf boot
rm -Rf data
rm -Rf dev
rm -Rf etc
rm -Rf home
rm -Rf '$HOME'
rm -Rf  lost+found
rm -Rf  media
rm -Rf  mnt
rm -Rf  opt
rm -Rf  proc
rm -Rf  repodata
rm -Rf  root
rm -Rf  root_901
rm -Rf  run
rm -Rf  sbin
rm -Rf  srv
rm -Rf  sys
rm -Rf  tmp
rm -Rf  usr
rm -Rf  zabbix
rm -rf bin
rm -Rf selinux software var
rm -Rf lamp
rm -Rf scp.sh screenquit.sh temp.retry web.retry mysql.retry mountIrdcBackUp.sh irdcops.retry install.sh install.log.syslog install.log id_rsa debug.retry crontab_ntpdate  anaconda-ks.cfg monitor.sh
rm -Rf  a getip
============================================================
解决办法:
.mkdir /root

cp -a /etc/skel/.[!.]* /root



主要是吧 /etc/skel/里面的文件拷贝回去就行了~~~哈..


cp -r /etc/skel/.bash
.bash_logout   .bash_profile  .bashrc  
法一:
cp -a /etc/skel/.[!.]* /root
chown -R root /root
chmod -R 700 /root

法二:从别的linux上拷贝一个root过来,后面删除时注意一下:
带你飞(39345****)  11:37:21
@回忆未来-向东-Jàck rm '$HOME'
加个引号就行了

参考:http://blog.csdn.net/wlqf366/article/details/50081389
linux提供了一个daemon函数,使得进程可以脱离控制台运行,实现了后台运行的效果。但是进程后台运行后,原本在终端控制台输出的数据就看不到了。那么,怎样才能找回这些数据?

这里,文章主题就围绕着 如何获得后台进程的控制台数据,其中的原理要从daemon说起。

daemon主要做两件事:
1、创建子进程,退出当前进程,并且以子进程创建新会话。这样,就算父进程退出,子进程也不会被关闭
2、将标准输入,标准输出,标准错误都重定向/dev/null

daemon 实现大致如下:

int daemonize(int nochdir, int noclose)
{
  int fd;

  switch (fork()) {
  case -1:
    return (-1);
  case 0:
    break;
  default:
    _exit(EXIT_SUCCESS);
  }

  if (setsid() == -1)
    return (-1);

  if (nochdir == 0) {
    if(chdir("/") != 0) {
      perror("chdir");
      return (-1);
    }
  }

  if (noclose == 0 && (fd = open("/dev/null", O_RDWR, 0)) != -1) {
    if(dup2(fd, STDIN_FILENO) < 0) {
      perror("dup2 stdin");
      return (-1);
    }
    if(dup2(fd, STDOUT_FILENO) < 0) {
      perror("dup2 stdout");
      return (-1);
    }
    if(dup2(fd, STDERR_FILENO) < 0) {
      perror("dup2 stderr");
      return (-1);
    }

    if (fd > STDERR_FILENO) {
      if(close(fd) < 0) {
        perror("close");
        return (-1);
      }
    }
  }
  return (0);
}
所以,想取回进程的控制台数据,只要将标准输出,标准错误重定向到指定文件,然后读取这个文件就好了。

文章这里写了个例子,简单演示下(这里通过kill信号完成进程通信,有点粗暴)
代码如下,保存为 daemon_example.c
#include
#include
#include
#include

static int fd = -1;

void sigroutine(int dunno) {
  switch (dunno) {
  case SIGUSR1:
    fprintf(stderr, "Get a signal -- SIGUSR1 \n");
    if (fd != -1) close(fd);
    fd = open("/tmp/console_temp.log", O_RDWR|O_APPEND|O_CREAT, 0600);
    if (fd == -1) break;
    dup2(fd, STDIN_FILENO);
    dup2(fd, STDOUT_FILENO);
    dup2(fd, STDERR_FILENO);
    break;
    
  case SIGUSR2:
    fprintf(stderr, "Get a signal -- SIGUSR2 \n");
    if (fd != -1) close(fd);
    fd = open("/dev/null", O_RDWR, 0);
    if (fd == -1) break;
    dup2(fd, STDIN_FILENO);
    dup2(fd, STDOUT_FILENO);
    dup2(fd, STDERR_FILENO);
    break;
  }
  return;

}

int main() {
  signal(SIGUSR1, sigroutine);
  signal(SIGUSR2, sigroutine);

  daemon(1,0);
  for (;;){
      fprintf(stderr,"test \n") ; // 不断打印test
      sleep(1);
  }
  return 0;
}
然后,编译和执行这个程序:
$ gcc -o daemon_example daemon_example.c
$ chmod +x daemon_example
$ ./daemon_example
$ ps -ef| grep daemon_example
root 11328 1 0 19:15 ? 00:00:00 ./daemon_example
如上,进程后台运行了,拿到pid 11328

按ctrl+c 退出脚本,这时脚本会通知进程将标准输出和标准错误重定向到 /dev/null,继续后台运行。
[root@iZ25dcp92ckZ testdemo]# sh -x ./test.sh 16935  
+ pid=16935
+ ps -p 16935
+ '[' '!' 0 -eq 0 ']'
+ echo pid 16935
pid 16935
+ trap 'kill -usr2 16935 && exit 1' HUP INT QUIT TERM
+ kill -usr1 16935
+ echo it works,please wait..
it works,please wait..
+ sleep 1
+ tail -f -n 0 /tmp/console_temp.log
test
test
test
test
==========================================================
接着,写个脚本测试这个程序, 保存为test.sh:
#!/bin/bash

pid=$1
ps -p $pid>/dev/null
if [ ! $? -eq 0 ] ; then
  echo pid does not exist!
  exit 1
fi
echo pid $pid
trap "kill -usr2 $pid && exit 1" HUP INT QUIT TERM
kill -usr1 $pid
echo it works,please wait..
sleep 1
tail -f -n 0 /tmp/console_temp.log
echo done!
执行这个脚本,结果如下:
$ ./test.sh 11328
pid 11328
it works,please wait..
test
test
然后,按ctrl+c 退出脚本,这时脚本会通知进程将标准输出和标准错误重定向到 /dev/null,继续后台运行。
这样,这个脚本就成了后台进程的调试工具了,需要后台数据的时候执行一下,不需要就关闭。当然,这只是一个示例,实际应用中要做改善,比如kill信号改成pipe或socket通讯,缓存文件要限制大小,或自动清除等。

摘自:http://blog.csdn.net/mycwq/article/details/50479735
背景:发现用ansible去做sudo时,发现权限不够:
TASK [irdcops : 修改 /etc/sudoers] ***********************************************
skipping: [10.70.37.24]
fatal: [10.70.36.172]: FAILED! => {"changed": false, "failed": true, "msg": "Could not replace file: /tmp/tmpfToWiS to /etc/sudoers: [Errno 1] Operation not permitted"}
fatal: [10.70.36.173]: FAILED! => {"changed": false, "failed": true, "msg": "Could not replace file: /tmp/tmpvA5FJh to /etc/sudoers: [Errno 1] Operation not permitted"}


[root@v-szq-Localizationweb13 etc]# chmod 755 sudoers
chmod: changing permissions of `sudoers': Operation not permitted
[root@v-szq-Localizationweb13 etc]# lsattr sudoers
----i--------e- sudoers
[root@v-szq-Localizationweb13 etc]#  chattr -i sudoers
[root@v-szq-Localizationweb13 etc]# visudo

http://www.linuxeye.com/command/chattr.html




去掉保护命令:





Form:http://jackxiang.com/post/1792/
背景: 一个程序运行了多长时间,能用ps命令得出来,像系统运行多长时间可以用uptime,一样的道理。
最简单的这个命令:

实践如下:
ps -ef|grep mysql
root      4572     1  0 7月09 ?       00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe


摘自 :http://www.cnblogs.com/fengbohello/p/4111206.html

写个小脚本,根据传入的参数显示对应进程的启动时间

ps -p 25352 -o lstart|grep -v "START"
比如运行:./showProRunTime.sh mysql 显示mysql进程的启动时间:
/usr/local/sbin/showProRunTime.sh


/tmp/synrpm.sh synrpm2repos
root     53504  0.0  0.1 119240  6436 ?        Ss   Jul17   0:00 /usr/local/php/bin/php /usr/local/sbin/synrpm2repos.php --daemon Sun Jul 17 16:57:39 2016

启动时间是:Sun Jul 17 16:57:39 2016
___________________________以下是参数说明_____________________________________________

ps -eo lstart 启动时间
ps -eo etime   运行多长时间.


ps -eo pid,lstart,etime | grep 5176


有些时候我们需要知道某个进程的启动时间!
显示某PID的启动时间命令:

ps -p PID -o lstart  


如下面显示httpd的启动时间:

for pid in $(pgrep httpd); do echo -n "${pid}"; ps -p ${pid} -o lstart | grep -v "START"; done  
====================================================================================
在Linux下,如果需要查看进程的启动时间, 常用ps aux命令,但是ps aux命令的缺陷在于只能显示时间到年、日期、或者时间, 无法具体到年月日时分秒。如果需要查看某个进程的具体启动时间, 使用 ps -p PID -o lstart,  其中,PID为某个进程的进程ID号。

如下所示, 显示系统中所有httpd进程的具体启动时间。

如下所示, 显示系统中所有httpd进程的具体启动时间。

for pid in $(pgrep httpd); do echo -n "${pid} " ; ps -p ${pid} -o lstart | grep -v "START" ; done
301 Mon Aug 27 11:21:59 2012
344 Mon Aug 27 11:33:13 2012
25065 Sun Aug 26 03:27:03 2012
25066 Sun Aug 26 03:27:03 2012
25067 Sun Aug 26 03:27:03 2012
25068 Sun Aug 26 03:27:03 2012
25069 Sun Aug 26 03:27:03 2012
25070 Sun Aug 26 03:27:03 2012
25071 Sun Aug 26 03:27:03 2012
25072 Sun Aug 26 03:27:03 2012
27903 Wed Jun 20 22:50:47 2012
32767 Mon Aug 27 11:21:48 2012

来自:http://www.iteye.com/topic/1135810
处理方法: 打开 /etc/.vimrc 并添加 set noswapfile 后 OK
vi /root/.vimrc
set noswapfile

非正常关闭vi编辑器时会生成一个.swp文件

关于swp文件
使用vi,经常可以看到swp这个文件,那这个文件是怎么产生的呢,当你打开一个文件,vi就会生成这么一个.(filename)swp文件以备不测(不测下面讨论),如果你正常退出,那么这个这个swp文件将会自动删除。下面说不测。
不测分为:1当你用多个程序编辑同一个文件时。
         2非常规退出时。
第一种情况的话,为了避免同一个文件产生两个不同的版本(vim中的原话),还是建议选择readonly为好。
第二种情况的话,你可以用vim -r filename恢复,然后再把swp文件删除(这个时候要确保你的swp文件没有用处了,要不然你会伤心的)
swp文件的来历,当你强行关闭vi时,比如电源突然断掉或者你使用了Ctrl+ZZ,vi自动生成一个.swp文件,下次你再编辑时,就会出现一些提示。

你可以使用

vi -r {your file name}

来恢复文件,然后用下面的命令删除swp文件,不然每一次编辑时总是有这个提示。

rm .{your file name}.swp

在网上搜到了一个类似的提示,不同的linux提示可能不一样

“.xorg.conf.swp” already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit:

当然可以用R键恢复。

vi编辑器要正常退出可以使用Shift-ZZ 。



[SuSE] 【已解决】vi 命令 生成 .swp 文件相关问题

-> 例:使用vi a.dat时 会生成一个 .a.dat.swp 文件
       然后再开个终端 vi a.dat 时会提示:
      【“Swap file ".文件名.swp" already exists![O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit:】  

-> vi 版本:
   vi -vierson
     VIM - Vi IMproved 6.3 (2004 June 7, compiled Oct 20 2004 23:12:36)
        
->  问: (vi 一个文件时怎么样可以不让它产生.swp文件?
          或不让他提示【“Swap file ".文件名.swp" already exists![O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit:】)

处理方法: 打开 /etc/vimrc 并添加 set noswapfile 后 OK

来自:http://blog.163.com/phys_atom/blog/static/167644553201222784342904/
1. 系统版本

CentOS 6.6 x86_64 Desktop

2. 设置yum代理

在Shell中运行以下命令:

vi /etc/yum.conf
在上述文件的最后,添加如下内容:

# Proxy

proxy=http://username:password@proxy_ip:port
其中,username是登录代理服务器的用户名,password是登录密码,proxy_ip是代理服务器的域名或IP地址,port是代理服务器的端口号。也可以使用proxy_username和proxy_password来配置代理的用户名和密码。这样的配置完成后,所有的用户在使用yum时,都会使用代理,可以说是全局代理。如果需要为单独的用户配置代理,可以在用户的~/.bash_profile文件中设置。

在Shell中运行以下命令,验证配置是否正确:

yum search gcc
若上述命令的输出信息如下图所示,则表示配置成功:

显示大图


3. 设置wget代理

在shell中运行以下命令:

vi /etc/wgetrc
在上述文件的最后,添加如下内容:

# Proxy

http_proxy=http://username:password@proxy_ip:port/

ftp_proxy=http://username:password@proxy_ip:port/
其中,http_proxy是http代理,ftp_proxy是ftp代理,其余变量的意义和设置yum代理的方法相同。

在Shell中运行以下命令,验证配置是否正确:

wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
若上述命令的输出信息如下图所示,则表示配置成功:



4. 设置系统全局代理

在shell中运行以下命令:

vi /etc/profile
在上述文件的最后,添加如下内容:

export http_proxy="http://username:password@proxy_ip:port"
各个变量的意义和设置yum代理的方法相同。配置的验证方法和yum代理、wget代理相同。
repo只要自己知道RPM位置,自己也可以写:


同步的是ymrepos.d里面的仓库明儿,一般都带x86或啥的,如果有多台不是64位成32位的需要yum下载,则不要用变量,直接写和服务器不一样的变量写死如死x86这样的路径。
关于CentOS6主CentOS7的不同变量了解,下面是centOS7的:
http://rpms.adiscon.com/v8-stable/epel-$releasever/$basearch
http://rpms.adiscon.com/v8-stable/epel-7/x86_64/
单位的机器是CentOS6且是64位的,上面的变量就变成:
http://rpms.adiscon.com/v8-stable/epel-6/x86_64/RPMS/
如果是32位的呢?变量部分会变成如下,就是这样:
http://rpms.adiscon.com/v8-stable/epel-6/i386/RPMS/
http://m.2cto.com/net/201512/455901.html

这个参数不常用,但提到架构问题了x86还是64位的:
  -a ARCH, --arch=ARCH  act as if running the specified arch (default: current
                        arch, note: does not override $releasever. x86_64 is a
                        superset for i*86.)

cat /etc/yum.repos.d/rsyslog.repo |grep releasever
name=Adiscon CentOS-$releasever - local packages for $basearch
#baseurl=http://rpms.adiscon.com/v8-stable/epel-$releasever/$basearch
===============================================================
如果执行的时候yum.repos.d里面的文件url写错了,会出现如下错误,也就是说写的目录下面必须有repodata这个索引文件夹:
http://rpms.adiscon.com/v8-stable/epel-6/i386/RPMS/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
也就是它会去repos的索引里面找,改为:
baseurl=http://rpms.adiscon.com/v8-stable/epel-6/i386          再:yum clean all就可以在64位机器下载同步使用32位,供32位 使用。  
baseurl=http://rpms.adiscon.com/v8-stable/epel-7/x86_64/

上面这些文件形成多个repo,于是就可能在一台X86_64位的机器上下载多种架构的机型,只有配置多个repos文件:
reposync --repoid=rsyslog_v8_32
[rsyslog_v8_32]
baseurl=http://rpms.adiscon.com/v8-stable/epel-6/i386

[rsyslog_v8_64]
baseurl=http://rpms.adiscon.com/v8-stable/epel-6/x86_64
reposync --repoid=rsyslog_v8_64



同样:
[root@iZ25dcp92ckZ tmp]# reposync --repoid=rsyslog_v8_i386
/tmp/rsyslog_v8_i386/RPMS/*.rpm

建立软链接:
ln -s /tmp/rsyslog_v8_i386/RPMS /data/www/yum/centos/6/x86_64/rsyslog_v8_i386
ln -s /tmp/rsyslog_v8_64/RPMS /data/www/yum/centos/6/x86_64/rsyslog_v8_64
这样,两个版本都能同时提供服务了:
直接cd 到/data/www/yum/centos/6/x86_64 ,createrepo --update -d -p -o . .  ,它会扫子目录的如/data/www/yum/centos/6/x86_64/rsyslog_v8_64 和 /data/www/yum/centos/6/x86_64/rsyslog_v8_i386:
cat /etc/yum.repos.d/cntv-irdc.repo
[cntv-irdc]
name=Centos $releasever - $basearch rpm repository
baseurl=http://10.70.41.222/centos/$releasever/$basearch

==============================================================
最终目的是想:elk+kafka+rsyslog+hadoophdfs+zookeeper搭建及其应用,http://www.it165.net/admin/html/201604/7496.html。
CentOS6.5安装配置官方最新版rsyslog:  http://blog.chinaunix.net/uid-21142030-id-5616974.html
总原则及结论:在YUM仓库下建立一个新的目录存放,在上一层建立索引,也可读取到子目录的方法。

同步思想:三台机器,一台用来reposync同步并在上面开一个rsyncd的服务指向,另两台来同步它,
A:上面有crontab去定时reposync,同时有一个定时同步rpm后createrepo --update -d -p -o . . 。
BC两台:  在定时同步A完成后,也需要作一下:createrepo --update -d -p -o . . ,更新一下索引。
步骤零:
关于CentOS6主CentOS7的不同变量了解,下面是centOS7的:
http://rpms.adiscon.com/v8-stable/epel-$releasever/$basearch
http://rpms.adiscon.com/v8-stable/epel-7/x86_64/
单位的机器是CentOS6且是64位的,上面的变量就变成:
http://rpms.adiscon.com/v8-stable/epel-6/x86_64/RPMS/
如果是32位的呢?变量部分会变成如下,就是这样:
http://rpms.adiscon.com/v8-stable/epel-6/i386/RPMS/


步骤一:安装必要的reposync的rpm包和repo同步的源:
rpm 包安装需要: yum-utils-1.1.30-37.el6.noarch
rpm -qf /usr/bin/reposync  安装包是:yum-utils-1.1.30-37.el6.noarch
yum install -y http://rdo.fedorapeople.org/rdo-release.rpm


步骤二:
安装后如何同步:
wget http://rpms.adiscon.com/v8-stable/rsyslog.repo -o /etc/yum.repos.d/rsyslog.repo
/etc/yum.repos.d/rsyslog.repo

http://rpms.adiscon.com/ 里全是各个版本的rpm包。

cd /data/www/yum/centos/6/x86_64/rsyslog_v8

[root@bj_szq_yum_repos_36_172 rsyslog_v8]# reposync --repoid=rsyslog_v8
Error setting up repositories: Cannot retrieve repository metadata (repomd.xml) for repository: rsyslog_v8. Please verify its path and try again

抓取这块咱还需要再商量商量下抓取地址和同步范围:
http://www.rsyslog.com/rhelcentos-rpms/

http://rpms.adiscon.com/v8-stable/rsyslog.repo
http://rpms.adiscon.com/v8-stable/
————————————————————————————
http://king9527.blog.51cto.com/84461/1096111
http://gdlwolf.blog.51cto.com/343866/1729020
http://www.ipcpu.com/2015/08/reposync-yum/
http://www.programgo.com/article/53684909700/

用reposync 同步YUM源到本地,搭建本地YUM源服务器:
http://www.tuicool.com/articles/7rANJj
————————————————————————————
#安装rdo的源文件
yum install -y http://rdo.fedorapeople.org/rdo-release.rpm
#查看源ID的列表
yum repolist
摘自:http://www.ipcpu.com/2015/08/reposync-yum/

发现这个rpm包其实就是向/etc/yum.repos.d里添加一个repo文件,如下:
rpm -qpl rdo-release.rpm
/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Cloud
/etc/yum.repos.d/rdo-release.repo
/etc/yum.repos.d/rdo-testing.repo

安装发现多了上面这俩文件:
rpm -ihv rdo-release.rpm
准备中...                          ################################# [100%]
正在升级/安装...
1:rdo-release-mitaka-5             ################################# [100%]
[root@iZ25dcp92ckZ yum.repos.d]# ls -lart rdo-*
-rw-r--r-- 1 root root 326 6月  14 05:57 rdo-testing.repo
-rw-r--r-- 1 root root 209 6月  14 05:57 rdo-release.repo
查看仓库:
yum repolist |grep openstack
openstack-mitaka/x86_64 OpenStack Mitaka Repository                        1,182


mkdir -p /data/htdocs/openstack
cd   /data/htdocs/openstack
找仓库:
cat rdo-release.repo |grep openstack-mitaka
[openstack-mitaka]
baseurl=http://mirror.centos.org/centos/7/cloud/$basearch/openstack-mitaka/
找到了:
reposync --repoid=openstack-mitaka

实践如下: du -sh /data/htdocs/openstack/ 277M    /data/htdocs/openstack/
reposync --repoid=openstack-mitaka
Xaw3d-1.6.2-4.el7.x86_64.rpm   FAILED                                                          ]  15 kB/s |  32 kB  12:11:55 ETA
warning: /data/htdocs/openstack/openstack-mitaka/common/Xaw3d-devel-1.6.2-4.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 764429e6: NOKEY
Xaw3d-devel-1.6.2-4.el7.x86_64.rpm 的公钥尚未安装
(1/1182): Xaw3d-devel-1.6.2-4.el7.x86_64.rpm                                                              |  58 kB  00:00:03    
(2/1182): babel-1.3-6.el7.noarch.rpm                                                                      |  15 kB  00:00:01    
(3/1182): babel-2.3.4-1.el7.noarch.rpm                                                                    |  18 kB  00:00:01    
(4/1182): babel-doc-1.3-6.el7.noarch.rpm                                                                  | 208 kB  00:00:14    
(5/1182): babel-doc-2.3.4-1.el7.noarch.rpm                                                                | 234 kB
这个文件得是644:
chmod -R 644 /usr/local/php/etc/php.logrotate
PHP的日志目录权限得是www:
chown -R www.www /data/logs/php
---------------------------------------------------------
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还有中文文件名在提交到仓库里出现乱码问题,删都删除不掉。
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
背景:获取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
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还没用熟悉又来了一个新的。
systemctl 命令完全指南:https://linux.cn/article-5926-1.html


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
内存不够的问题会很多:
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
#其中按进程统计句柄数 第一列是打开的句柄数,第二列是进程ID。
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr
#其中按句柄类型统计句柄数 其中REG代表文件
lsof -n|awk '{print $5}'|sort|uniq -c|sort -nr
#查看总共文件句柄数
lsof|wc -l
#查看网络句柄数 和用netstat统计一样,原理是:linux中一切皆文件(内存、网络、硬盘。。。)
lsof |grep IPv4|wc -l
lsof |grep TCP|wc -l

来自:https://blog.csdn.net/bolg_hero/article/details/77622616
=======================================================================================
背景:有时候出现句柄数不够用的情况,得用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/
origin 是默认的远程版本库名称
你可以在 .git/config 之中进行修改

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