php守护进程:使用php来做守护进程

  [ 起源 ]

  Linux/Unix下守护进程(Daemon)大家都知道比如我们常用httpd、mysqld等等就是常驻内存运行类似于Windows下服务般守护进程都是使用C/C来写就是通过fork生成子进程当前台shell下父进程被杀掉子进程就转到后台运行为了不在终端产生输出信息就通过syslog等来写日志文件

  我们知道php是脚本语言通过php脚本引擎来执行所以要做成守护进程比较麻烦我们今天就来结合Unix/Linux命令来实现我们守护进程功能

  [ 原理 ]

  Unix中nohup命令功能就是不挂断地运行命令同时nohup把所有输出到放到当前目录nohup.out文件中如果文件不可写则放到<用户主目录>/nohup.out 文件中那么有了这个命令以后我们php就写程shell脚本使用循环来让我们脚本直运行那么不管我们终端窗口是否关闭都能够让我们php脚本直运行当然当我们php进程被杀或者我们操作系统重启了自然就会中止了

  [ 功能 ]

  肯定会问让我们php脚本做了守护进程又有什么用处呢?当然有比如最典型作用能够基本替代cron功能比如我们需要定期实行某些操作完全可以交给它来做不再需要cron当然如果服务器重启就没有办法了不过Unix服务器不是那么容易重启另外我们还可以做个简单服务器端功能比如做个能够Telnet过去服务器嘿嘿可以做成个小后门不过这样实现稍微有点复

  杂

  [ 实战 ]

  例子:自动生成文件

  我们现在来做两个例子来证明我们上面说法首先第个是每个 3十秒自动生成个文件永远执行下去

  首必须确保操作系统是Unix或者Linux比如可以是FreeBSD、Redhat、Fedora或者SUSE什么然后我们必须确保我们php脚本引擎是在 /usr/local/php/bin/php具体路径可以按照你实际路径来写如果没有脚本引擎请自行安装

  比如当前目录是 /home/heiyeluren/那么我们使用vi或者其他编辑器编写个叫做php_daemon1.php文件:

  $ vi php_daemon1.php

  然后写入如下代码:

#! /usr/local/php/bin/php
<?
_time_limit(0);
while(1)
{
@fopen("test_".time.".txt","w");
sleep(30);
}
?>


  然后保存并且退出vi然后赋予php_daemon1.php文件可执行权限:

  $ chmod +x /home/heiyeluren/php_daemon1.php

  然后再让我们脚本再后台执行执行如下命令:

  $ nohup /home/heiyeluren/php_daemon1.php &

  记得最后加上 & 符号这样才能够跑到后台去运行执行上述命令后出现如下提示:

  [1] 82480

  appending output to nohup.out

  再回后车后将出现shell提示符那么上面提示就是说所有命令执行输出信息都会放到 nohup.out 文件中这个上面已经讲了然后执行上面命令后我们每个 3十秒在当前目录就会看到多出以test_开头文件比如:test_1139901144.txt test_1139901154.txt等等文件那么就证明我们已经再后台运行了

  那么我们如何终止运行呢?最好办法就是重启操作系统呵呵当然这是不可取我们可以使用kill命令来杀掉这个进程杀进程的前自然后知道进程PID号就是Process ID使用ps命令就能够看到了

  $ 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

  上面我们已经看到了我们php进程id是:82510 于是我们再执行kill命令:

  $ kill -9 82510

  [1]+ Killed         nohup /home/heiyeluren/php_daemon1.php

  看到这么提示就明白这个进程被杀了再ps就会发现没有了:

  $ ps

  PID TT STAT   TIME COMMAND

  82374 p3 Ss   0:00.17 -bash (bash)

  82535 p3 R+   0:00.00 ps

  如果直接ps命令无法看到进程那么就使用 ps & apos 两个结合命令来查看定能够看到进程

  再上面基础上进程扩展能够做成属于自己cron那就不需要cron啦当然这只是种方式

Tags:  java守护进程 linux守护进程 守护进程 php守护进程

延伸阅读

最新评论

发表评论