Linux管道PIPE的原理和应用

Linux中进程的通信方式有信号,管道,共享内存,消息队列socket等。其中管道是*nix系统进程间通信的最古老形式,所有*nix都提供这种通信方式。管道是一种半双工的通信机制,也就是说,它只能一端用来读,另外一端用来写;另外,管道只能用来在具有公共祖先的两个进程之间通信。管道通信遵循先进先出的原理,并且数据只能被读取一次,当此段数据被读取后,马上会从数据中消失,这一点很重要。

Linux上,创建管道使用pipe函数,当它执行后,会产生两个文件描述符,分别为读端和写端。单个进程中的管道几乎没有任何作用,通常会先调用pipe,然后调用fork,从而创建从父进程到子进程的IPC通道。 …阅读更多>>

Linux中exec系列函数的应用

这段时间在研究linux中用户登陆和shell执行程序的原理。我们知道,shell命令分为内部命令和外部命令,内部命令有诸如cd,history,exit,echo等,常见的外部命令有ls,ping,netstat等,通过type命令可以查看一个命令是内部命令还是外部命令。当执行的命令是一个内部命令是,shell直接执行;那么shell是如何执行一个外部命令的呢?
…阅读更多>>

Linux中的dup和dup2函数

在前面一篇“用Python给Linux编写守护进程”的文章中,讲到了如何利用python给linux编写一个守护函数。文章讲到了守护进程不依赖用户终端,所以输出的信息用户是察觉不到的,但是有时候我们又需要记录一些信息。例如web服务中,我们可以需要记录访问日志,错误日志等等;在著名的web服务器nginx中,我们可以通过access_log和error_log分别指定访问日志和错误日志的存放位置。
…阅读更多>>

WordPress中获取随机文章导致服务器压力过大的问题分析

最近发现有个服务器上的网站打开速度很慢,有时甚至出现完全打不开的情况。查看了一下服务器状态,发现服务器负载很大,最高时候,load average5分钟平均值都到了20(8核心CPU),接着查看了一下服务IO情况,发现Mysql读写非常频繁,如下图

服务IO状态

服务IO状态

这显然是不正常的情况。接着,本人又查看了mysql的状态,发现出现” Copying to tmp table”的状态,查询语句为“SELECT ID, post_title,guid”。问题应该就出现在这里了,大量临时表的读写显然会导致IO过高,按理说,WordPress官方应该对这些查询做过一些优化,如果一个wordpress会导致出现如此大的问题,它应该也不会如此流行。
…阅读更多>>

Linux中更改当前进程运行身份

在上一篇文章中,我们讲了如何在linux上用python写一个守护进程。主要原理是利用linux的fork函数来创建一个进程,然后退出父进程运行,生成的子进程就会成为一个守护进程。细心观察的可能会发现,这个守护进程的运行身份是执行这个程序的用户,如果把这个守护程序加入到系统的服务项,那么这个守护程序的执行身份应该是root。
…阅读更多>>

用Python给Linux编写守护进程

守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控。此类程序会被以进程的形式初始化。通常,守护进程没有任何存在的父进程(即PPID=1),且在UNIX系统进程层级中直接位于init之下。守护进程程序通常通过如下方法使自己成为守护进程:对一个子进程调用fork,然后使其父进程立即终止,使得这个子进程能在init下运行。–维基百科

…阅读更多>>