[ 起源 ]
Linux/Unix下守护进程(Daemon)大家都知道
![](/icons/3173dou.gif)
比如我们常用
![](/icons/3173de.gif)
httpd、mysqld等等
![](/icons/3173dou.gif)
就是常驻内存运行
![](/icons/3173de.gif)
![](/icons/3173chengxu.gif)
![](/icons/3173dou.gif)
类似于Windows下
![](/icons/3173de.gif)
服务
![](/icons/3173dou2.gif)
![](/icons/3173yi.gif)
般守护进程都是使用C/C
![](/icons/3173jiajia.gif)
来写
![](/icons/3173dou.gif)
就是通过fork生成子进程
![](/icons/3173dou.gif)
当前台shell下
![](/icons/3173de.gif)
父进程被杀掉
![](/icons/3173dou.gif)
子进程就转到后台运行
![](/icons/3173dou.gif)
为了不在终端产生输出信息
![](/icons/3173dou.gif)
就通过syslog等
![](/icons/3173hanshu.gif)
来写日志文件
![](/icons/3173dou2.gif)
我们知道php是脚本语言
![](/icons/3173dou.gif)
通过php
![](/icons/3173de.gif)
脚本引擎来执行
![](/icons/3173dou.gif)
所以要做成守护进程比较麻烦
![](/icons/3173dou.gif)
我们今天就来结合Unix/Linux
![](/icons/3173de.gif)
命令来实现我们守护进程
![](/icons/3173de.gif)
功能
![](/icons/3173dou2.gif)
[ 原理 ]
Unix中
![](/icons/3173de.gif)
nohup命令
![](/icons/3173de.gif)
功能就是不挂断地运行命令
![](/icons/3173dou.gif)
同时nohup把
![](/icons/3173chengxu.gif)
![](/icons/3173de.gif)
所有输出到放到当前目录
![](/icons/3173de.gif)
nohup.out文件中
![](/icons/3173dou.gif)
如果文件不可写
![](/icons/3173dou.gif)
则放到<用户主目录>/nohup.out 文件中
![](/icons/3173dou2.gif)
那么有了这个命令以后
![](/icons/3173dou.gif)
我们
![](/icons/3173de.gif)
php
![](/icons/3173chengxu.gif)
就写程shell脚本
![](/icons/3173dou.gif)
使用循环来让我们
![](/icons/3173de.gif)
脚本
![](/icons/3173yi.gif)
直运行
![](/icons/3173dou.gif)
那么不管我们终端窗口是否关闭
![](/icons/3173dou.gif)
都能够让我们
![](/icons/3173de.gif)
php脚本
![](/icons/3173yi.gif)
直运行
![](/icons/3173dou2.gif)
当然
![](/icons/3173dou.gif)
当我们
![](/icons/3173de.gif)
php进程被杀或者我们
![](/icons/3173de.gif)
操作系统重启了
![](/icons/3173dou.gif)
自然就会中止了
![](/icons/3173dou2.gif)
[ 功能 ]
肯定会问
![](/icons/3173dou.gif)
让我们
![](/icons/3173de.gif)
php脚本做了守护进程又有什么用处呢?当然有
![](/icons/3173dou.gif)
比如最典型
![](/icons/3173de.gif)
作用
![](/icons/3173dou.gif)
能够基本
![](/icons/3173de.gif)
替代cron
![](/icons/3173de.gif)
功能
![](/icons/3173dou.gif)
比如我们需要定期实行
![](/icons/3173de.gif)
某些操作
![](/icons/3173dou.gif)
完全可以交给它来做
![](/icons/3173dou.gif)
不再需要cron
![](/icons/3173dou.gif)
当然
![](/icons/3173dou.gif)
如果服务器重启就没有办法了
![](/icons/3173dou.gif)
不过
![](/icons/3173dou.gif)
![](/icons/3173yi.gif)
般
![](/icons/3173de.gif)
Unix服务器不是那么容易重启
![](/icons/3173de.gif)
![](/icons/3173dou2.gif)
另外
![](/icons/3173dou.gif)
我们还可以做
![](/icons/3173yi.gif)
个简单
![](/icons/3173de.gif)
服务器端
![](/icons/3173de.gif)
功能
![](/icons/3173dou.gif)
比如做
![](/icons/3173yi.gif)
个能够Telnet过去
![](/icons/3173de.gif)
服务器
![](/icons/3173dou.gif)
嘿嘿
![](/icons/3173dou.gif)
可以做成
![](/icons/3173yi.gif)
个小后门
![](/icons/3173dou.gif)
不过这样实现稍微有点复
杂
![](/icons/3173dou2.gif)
[ 实战 ]
例子:自动生成文件
我们现在来做两个例子来证明我们上面
![](/icons/3173de.gif)
说法
![](/icons/3173dou2.gif)
首先第
![](/icons/3173yi.gif)
个是每个 3十秒自动生成
![](/icons/3173yi.gif)
个文件
![](/icons/3173dou.gif)
永远执行下去
![](/icons/3173dou2.gif)
首必须确保操作系统是Unix或者Linux
![](/icons/3173dou.gif)
比如可以是FreeBSD、Redhat、Fedora或者SUSE什么
![](/icons/3173de.gif)
![](/icons/3173dou2.gif)
然后我们必须确保我们
![](/icons/3173de.gif)
php脚本引擎是在 /usr/local/php/bin/php
![](/icons/3173dou.gif)
具体路径可以按照你实际路径来写
![](/icons/3173dou.gif)
如果没有脚本引擎
![](/icons/3173dou.gif)
请自行安装
![](/icons/3173dou2.gif)
比如当前目录是 /home/heiyeluren/
![](/icons/3173dou.gif)
那么我们使用vi或者其他编辑器编写
![](/icons/3173yi.gif)
个叫做php_daemon1.php
![](/icons/3173de.gif)
文件:
$ vi php_daemon1.php
然后写入如下代码:
#! /usr/local/php/bin/php
<?
_time_limit(0);
while(1)
{
@fopen("test_".time
.".txt","w");
sleep(30);
}
?>
然后保存并且退出vi
![](/icons/3173dou.gif)
然后赋予php_daemon1.php文件可执行权限:
$ chmod +x /home/heiyeluren/php_daemon1.php
然后再让我们
![](/icons/3173de.gif)
脚本再后台执行
![](/icons/3173dou.gif)
执行如下命令:
$ nohup /home/heiyeluren/php_daemon1.php &
记得最后加上 & 符号
![](/icons/3173dou.gif)
这样才能够跑到后台去运行
![](/icons/3173dou.gif)
执行上述命令后出现如下提示:
[1] 82480
appending output to nohup.out
再回后车后将出现shell提示符
![](/icons/3173dou2.gif)
那么上面
![](/icons/3173de.gif)
提示就是说
![](/icons/3173dou.gif)
所有命令执行
![](/icons/3173de.gif)
输出信息都会放到 nohup.out 文件中
![](/icons/3173dou.gif)
这个上面已经讲了
![](/icons/3173dou2.gif)
然后执行上面命令后
![](/icons/3173dou.gif)
我们每个 3十秒在当前目录就会看到多出以test_开头
![](/icons/3173de.gif)
文件
![](/icons/3173dou.gif)
比如:test_1139901144.txt test_1139901154.txt等等文件
![](/icons/3173dou.gif)
那么就证明我们
![](/icons/3173de.gif)
![](/icons/3173chengxu.gif)
已经再后台运行了
![](/icons/3173dou2.gif)
那么我们如何终止
![](/icons/3173chengxu.gif)
![](/icons/3173de.gif)
运行呢?最好办法就是重启操作系统
![](/icons/3173dou.gif)
呵呵
![](/icons/3173dou.gif)
当然
![](/icons/3173dou.gif)
这是不可取
![](/icons/3173de.gif)
![](/icons/3173dou.gif)
我们可以使用kill命令来杀掉这个进程
![](/icons/3173dou.gif)
杀进程的前自然后知道进程
![](/icons/3173de.gif)
PID号
![](/icons/3173dou.gif)
就是Process ID
![](/icons/3173dou.gif)
使用ps命令就能够看到了
![](/icons/3173dou2.gif)
$ ps
PID TT STAT TIME COMMAND
82374 p3 Ss 0:00.14 -bash (bash)
82510 p3 S 0:00.06 /usr/local/php/bin/php /home/heiyeluren/php_daemon1.php
82528 p3 R+ 0:00.00 ps
上面我们已经看到了我们
![](/icons/3173de.gif)
php
![](/icons/3173de.gif)
进程id是:82510
![](/icons/3173dou.gif)
于是我们再执行kill命令:
$ kill -9 82510
[1]+ Killed nohup /home/heiyeluren/php_daemon1.php
看到这么提示就明白这个进程被杀了
![](/icons/3173dou.gif)
再ps
![](/icons/3173dou.gif)
就会发现没有了:
$ ps
PID TT STAT TIME COMMAND
82374 p3 Ss 0:00.17 -bash (bash)
82535 p3 R+ 0:00.00 ps
如果直接ps命令无法看到进程
![](/icons/3173dou.gif)
那么就使用 ps & apos 两个结合命令来查看
![](/icons/3173dou.gif)
![](/icons/3173yi.gif)
定能够看到进程
![](/icons/3173dou2.gif)
再上面
![](/icons/3173de.gif)
基础上进程扩展
![](/icons/3173dou.gif)
能够做成属于自己
![](/icons/3173de.gif)
cron
![](/icons/3173chengxu.gif)
![](/icons/3173dou.gif)
那就不需要cron啦
![](/icons/3173dou.gif)
当然
![](/icons/3173dou.gif)
这只是
![](/icons/3173yi.gif)
种方式
延伸阅读
最新评论