1. 如何杀死defunct进程(译)

    原文:How to kill defunct process

    译者:youngsterxyf

    defunct进程是指出错损坏的进程,父子进程之间不会再通信。有时,它们会演变成“僵尸进程”,存留在你的系统中,直到系统重启。可以尝试 “kill -9” 命令来清除,但多数时候不管用。

    为了杀死这些defunct进程,你有两个选择:

    • 重启你的计算机
    • 继续往下读...

    我们先看看系统中是否存在defunct进程:

    $ ps -A | grep defunct
    

    假设得到的输出如下所示:

    8328 ? 00:00:00 mono <defunct>
    8522 ? 00:00:01 mono <defunct>
    13132 ? 00:00:00 mono <defunct>
    25822 ? 00 …
    Tagged as : Linux
  2. 运营开发规范化

    今年3月底毕业,入职腾讯做运营开发,至今6个月有余。入职之时组内仅有1个运营开发的同事,到目前已扩充到5人,加3个实习生。

    入职之时的运营开发过程是这样的:

    1. 在办公机器(Windows)上编写代码,功能测试通过后,
    2. ssh远程连接到生产服务器(Linux),vim打开一个新文件,复制办公机器上的代码,粘贴到vim中,保存,
    3. 打开浏览器测试上线的功能/效果是否正确,若不正确,
    4. 直接在生产服务器上编辑代码文件,直到达到需要的功能效果,
    5. 再从生产服务器上将修改后的代码复制粘贴到办公机器(也许不会有这一步,之后所有的修改都直接在生产服务器上操作)。

    这个过程存在如下问题:

    1. 代码没有版本控制
    2. 没有与生产服务器一致的测试环境
    3. 代码部署过程繁琐
    4. 办公开发机器上代码很可能比生产服务器上代码还旧
    5. 上面4点都会导致混乱

    除此之外,当团队从1人扩充到多人后,不可避免地会遇到协作的问题,解决代码开发协作问题一般涉及如下几方面:

    1. 使用代码版本控制
    2. 规定版本控制的工作流
    3. 编码规范
    4. 项目/代码文档
    5. 定期code review

    为了解决上述问题,我陆续地做了如下工作:

    搭建Gitlab服务器、测试服务器

    个人认为开发工作规范化的第一点就是版本控制,基于版本控制可以完成很多自动化的任务。

    平时个人的代码、文档都通过Git版本控制存放在Github上 …

  3. 一项工作中涉及的几个命令

    今天写了点shell脚本,在一些CentOS服务器上进行了一些操作,涉及如下命令:

    统计特定进程个数

    如统计haproxy进程的个数

    ps -e | grep haproxy | wc -l
    

    获取特定进程的pid

    如获取haproxy进程的pid

    ps -e | grep haproxy | awk '{print $1}'
    

    一对多添加ssh信任关系

    如192.168.2.1用户usernameA到192.168.2.x用户usernameB的信任关系

    1. 在192.168.2.1创建自己的公钥私钥:

      ssh-keygen -t rsa   # 提示输入时,全部留空回车。
      
    2. 拷贝192.168.2.1的公钥到192.168.2.x机器上:

      ssh-copy-id "-p 22 usernameB@192.168 …
    Tagged as : Linux 命令行
  4. 搭建测试服务器(源码编译方式)

    目前工作中开发流程还比较初级,甚至连测试服务器都没有,代码的变更都是直接先在开发人员的本地机器上简单测试一下,然后直接部署到生产服务器上,这就相当于生产服务器同时充当了测试服务器的角色,虽然开发的是面向公司内部的系统,但作为一个有理想有追求的码农,是不允许这样粗糙混乱的开发流程的,所以申请了台服务器,自己搭建个测试服务器。

    由于公司的服务器统一使用SUSE Linux Server操作系统,并且版本较老。与Ubuntu、Centos等Linux发行版不同,SUSE Linux没有可用的软件源(不知是否与OpenSUSE的软件源兼容?),即没法使用系统的软件包管理工具。这样问题就很多了。

    我选择源码编译的方式来安装所有涉及的软件。也许有人会说,为什么不在网络上查找RPM包然后安装呢?那么先想一下RPM包本质上是个什么东西呢?RPM包(以及DEB包)其实就是将编译好的一些程序以一定的规则打包在一起,然后系统的包管理工具(yum、zypper)按照相同的规则(在依赖满足的情况下)将RPM包里文件复制到指定好的目录里。如果RPM包的依赖没有解决,是无法成功安装的。即使安装好了,若程序依赖的动态链接库等不存在或版本不匹配,也是无法正确运行的,比如libc库的版本过低,但明显你不能轻易替换libc库,因为系统中已安装的很多程序都依赖于libc库。那么相比源码编译方式,RPM包方式的问题更难解决。

    需要安装的软件有Nginx、PHP、MySQL、Memcached、Redis、Mongodb …

  5. 几个组合命令

    1. Debian系Linux下查找某个软件包(以indent为例):

    apt-cache search indent | awk '{if($1~/^indent$/) print $0}'
    

    APT包管理工具也提供了类似功能的命令选项:

    apt-cache pkgnames 'indent'
    

    只不过这个输出仅有包名没有简介信息。

    2. 对当前目录下的所有C源码文件使用indent进行格式化:

    ls | grep '\.c$' | xargs indent
    

    其实如下也是可以的:

    indent *.c
    

    但因为shell会对*进行展开,如果当前目录下的C源码文件数目很大时,可能会造成命令行长度过长的问题。

    Tagged as : Linux 命令行
  6. 日志信息命令行实时输出

    Web开发中很多时候需要边看web服务器的日志输出边调试代码。一般的做法使用tail命令输出日志文件的末尾几行日志信息。

    tail -10 /var/log/nginx/access.log  # 输出末尾10行
    

    但这样的输出是静态的。在这个命令执行之后,日志文件里新增的日志信息无法直接看到。调试的时候,一遍又一遍地使用这样的命令去查询就显得非常麻烦。那有没有办法来监听日志文件的变化,实时输出最新的日志信息呢? xtail 就专为这个问题而存在的。它可以监听文件或者目录(监听目录就是监听该目录下的所有文件)。比如我在写本文时,在另一个命令行窗口里执行:

    xtail ./
    

    那么每次vim保存内容时,那个窗口就会产生事件输出最新的文件内容。

    这样在调试web程序的时候就很方便啦。

    其实tail本身就支持监听文件并实时命令行输出。在xtail的项目主页上有这样的说明:

    xtail watches the growth of files. It's like running a tail -f on a bunch of files at once …

    Tagged as : linux 命令 调试
  7. 博大精深的ps命令

    Linux命令行里如何获取所有的进程号(pid)?

    1. 第一种方法是通过ps -e或者ps aux获得所有进程的信息,然后通过管道传给grep或者awk进行数据过滤,比如

    ps -e | awk '{print $1}'
    

    2. 其实通过ps自身的选项就可以实现:

    ps -eo pid
    

    而且输出还是排好序的。

    但ps命令在输出进程信息之前先输出一行header,比如ps -e的输出header是:

    PID TTY          TIME CMD
    

    如何去除这个header呢?当然用各种过滤方法可以实现,但ps自身的选项也可以实现:

    ps -eo pid h
    

    或者

    ps -eo pid --no-headers
    
    Tagged as : Linux 命令行 工具
  8. CentOS + rsync + inotify-tools实时备份配置

    现实中,服务器可能会因为各种原因而crash掉,从而造成数据丢失或者服务的暂时不可用。为了提高服务的可用性以及数据的安全性,就需要对数据进行备份,以便数据恢复或者服务的动态切换(将访问请求动态重定向到备份服务器)。

    常见的备份方法是定时的rsync任务或者远程拷贝。但这种方式,如果定时的间隔较大,那么服务器宕掉后,还是会丢失部分数据,动态切换的服务也不是宕机前的最新状态。为了支持实时数据同步,Linux 2.6.13 内核中新引入文件系统变化通知机制inotify,一旦对文件系统有改动,就会触发相关事件任务。通过结合rsync,inotify能够很好地完成实时同步任务。

    主服务器:1.1.1.1 备份服务器:0.0.0.0

    配置步骤

    1. 主服务器,备份服务器上安装rsync:

    sudo yum install rsync
    

    2. 主服务器上安装inotify-tools:

    sudo yum install inotify-tools
    

    3. 备份服务器上添加配置文件/etc …

    Tagged as : 服务器 工具 Linux

Page 1 / 3