首页 php教程 php手册 php守护进程 加linux命令nohup实现任务每秒执行一次

php守护进程 加linux命令nohup实现任务每秒执行一次

Jun 06, 2016 pm 08:38 PM
nohup 守护进程

那么有了这个命令以后我们php就写成shell 脚本使用循环来让我们脚本一直运行下去,不管我们终端窗口是否关闭都能够让我们php 脚本一直运行下去。

Unix中 nohup 命令功能就是不挂断地运行命令,同时 nohup 把程序的所有输出到放到当前目录 nohup.out 文件中,如果文件不可写,则放到 /nohup.out 文件中。那么有了这个命令以后我们php就写成shell 脚本使用循环来让我们脚本一直运行下去,不管我们终端窗口是否关闭都能够让我们php 脚本一直运行下去。
马上动手写个 PHP 小程序,功能为每30秒记录时间,写入到文件
代码如下:
# vi for_ever.php
#! /usr/local/php/bin/php
define('ROOT', dirname(__FILE__).'/');
set_time_limit(0);
while (true) {
file_put_contents(ROOT.'for_ever.txt', date('Y-m-d H:i:s')."\n", FILE_APPEND);
echo date('Y-m-d H:i:s'), ' OK!';
sleep(30);
}
?>

保存退出,然后赋予 for_ever.php 文件可执行权限:
# chmod +x for_ever.php
让它在再后台执行:
# nohup /home/andy/for_ever.php.php &
记得最后加上 & 符号,这样才能够跑到后台去运行
执行上述命令后出现如下提示:
[1] 5157
nohup: appending output to 'nohup.out'
所有命令执行输出信息都会放到 nohup.out 文件中
这时你可以打开 for_ever.php 同目录下的 for_ever.txt 和 nohup.out 看看效果!
好了,它会永远运行下去了,怎么结束它呢?
# ps
PID TTY TIME CMD
4247 pts/1 00:00:00 bash
5157 pts/1 00:00:00 for_ever.php
5265 pts/1 00:00:00 ps
# kill -9 5157
找到进程号 5157 杀之,你将看到
[1]+ Killed nohup /home/andy/for_ever.php
OK!
====================
在很多项目中,或许有很多类似的后端脚本需要通过crontab定时执行。比如每10秒检查一下用户状态。脚本如下:
@file: /php_scripts/scan_userstatus.php
代码如下:
#!/usr/bin/env php -q
$status = has_goaway();
if ($status) {
//done
}
?>

通过crontab定时执行脚本scan_userstatus.php
#echo “*:*/10 * * * * /php_scripts/scan_userstatus.php”
这样,每隔10秒钟,就会执行该脚本。
我们发现,在短时间内,该脚本的内存资源还没有释放完,又启用了新的脚本。也就是说:新脚本启动了,旧脚本占用的资源还没有如愿释放。如此,日积月累,浪费了很多内存资源。我们对这个脚本进行了一下改进,改进后如下:
@file: /php_scripts/scan_userstatus.php
代码如下:
#/usr/bin/env php -q
while (1) {
$status = has_goaway();
if ($status) {
//done
}
usleep(10000000);
}
?>

这样,不需要crontab了。可以通过以下命令执行脚本,达到相同的功能效果
#chmod +x /php_scripts/scan_userstatus.php
#nohup /php_scripts/scan_userstatus.php &
在这里,我们通过&将脚本放到后台运行,为了防止随着终端会话窗口关闭进程被杀,我们使用了nohup命令。那么有没有办法,不使nohup命令,也能够运行呢,就像Unin/Linux Daemon一样。接下来,就是我们要讲的守护进程函数。
什么是守护进程?一个守护进程通常补认为是一个不对终端进行控制的后台任务。它有三个很显著的特征:在后台运行,与启动他的进程脱离,无须控制终端。常用的实现方式是fork() -> setsid() -> fork() 详细如下:
@file: /php_scripts/scan_userstatus.php
代码如下:
#/usr/bin/env php -q
daemonize();
while (1) {
$status = has_goaway();
if ($status) {
//done
}
usleep(10000000);
}
function daemonize() {
$pid = pcntl_fork();
if ($pid === -1 ) {
return FALSE;
} else if ($pid) {
usleep(500);
exit(); //exit parent
}
chdir("/");
umask(0);
$sid = posix_setsid();
if (!$sid) {
return FALSE;
}
$pid = pcntl_fork();
if ($pid === -1) {
return FALSE;
} else if ($pid) {
usleep(500);
exit(0);
}
if (defined('STDIN')) {
fclose(STDIN);
}
if (defined('STDOUT')){
fclose(STDOUT);
}
if (defined('STDERR')) {
fclose(STDERR);
}
}
?>

实现了守护进程函数以后,则可以建立一个常驻进程,所以只需要执行一次:
#/php_scripts/scan_userstatus.php
这里较为关键的二个php函数是pcntl_fork()和posix_setsid()。fork()一个进程,则表示创建了一个运行进程的副本,副本被认为是子进程,而原始进程被认为是父进程。当fork()运行之后,则可以脱离启动他的进程与终端控制等,也意味着父进程可以自由退出。 pcntl_fork()返回值,-1表示执行失败,0表示在子进程中,而返进程ID号,则表示在父进程中。在这里,退出父进程。setsid(),它首先使新进程成为一个新会话的“领导者”,最后使该进程不再控制终端,这也是成为守护进程最关键的一步,这意味着,不会随着终端关闭而强制退出进程。对于一个不会被中断的常驻进程来说,这是很关键的一步。进行最后一次fork(),这一步不是必须的,但通常都这么做,它最大的意义是防止获得控制终端。(在直接打开一个终端设备,而且没有使用O_NOCTTY标志的情况下, 会获得控制终端).
其它事项说明:
1) chdir() 将守护进程放到总是存在的目录中,另外一个好处是,你的常驻进程不会限制你umount一个文件系统。
2)umask() 设置文件模式,创建掩码到最大的允许限度。如果一个守护进程需要创建具有可读,可写权限的文件,一个被继承的具有更严格权限的掩码会有反作用。
3)fclose(STDIN), fclose(STDOUT), fclose(STDERR) 关闭标准I/O流。注意,如果有输出(echo),则守护进程会失败。所以通常将STDIN, STDOUT, STDERR重定向某个指定文件.
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

nohup的作用及原理解析 nohup的作用及原理解析 Mar 25, 2024 pm 03:24 PM

nohup的作用及原理解析在Unix和类Unix操作系统中,nohup是一个常用的命令,用于在后台运行命令,即便用户退出当前会话或关闭终端窗口,命令仍然能够继续执行。在本文中,我们将详细解析nohup命令的作用和原理。一、nohup的作用后台运行命令:通过nohup命令,我们可以让需要长时间运行的命令在后台持续执行,而不受用户退出终端会话的影响。这在需要运行

nohup命令运行后如何关闭 nohup命令运行后如何关闭 Mar 18, 2024 pm 03:00 PM

四种方法:查找进程 ID(PID)并使用“kill”命令终止进程;使用“killall”命令(谨慎使用)终止所有“nohup”进程;查看“nohup.out”文件以获取相关信息。通过这些方法,用户可以有效关闭“nohup”命令后台执行的任务。

Python服务器编程:守护进程的实现方式 Python服务器编程:守护进程的实现方式 Jun 18, 2023 pm 08:04 PM

Python是一门非常流行的编程语言,尤其在网络编程方面有着广泛的应用。服务器端的编程也是其中之一。在服务器端编程中,守护进程是一个常见的概念。本篇文章介绍Python服务器编程中实现守护进程的方式。什么是守护进程在服务器端程序运行的过程中,为了保证程序长期稳定的运行,我们需要将其转化为守护进程。守护进程是一种在后台持续运行的进程,该进程不会占用控制台或登录

利用nohup和&提升进程控制效率 利用nohup和&提升进程控制效率 Mar 25, 2024 pm 04:15 PM

近年来,随着信息技术的不断发展,大多数的工作都离不开计算机的帮助。在计算机操作过程中,经常会遇到需要同时运行多个进程的情况,而提升进程控制效率是非常关键的。本文将介绍如何利用Linux系统中的nohup和&命令来提升进程控制效率。1.了解nohup和&命令在Linux系统中,nohup是一个用来忽略挂起信号的命令,可以使命令在后台运行,即使用户退出终端,也

nohup是什么意思 nohup是什么意思 Mar 18, 2024 pm 03:14 PM

nohup命令是Unix/Linux系统中用于在后台执行命令的工具。其作用是使命令忽略挂断信号,即使终端关闭也不会中断执行。通常,nohup会将命令输出重定向到nohup.out文件中,方便后续查看。

nohup和&的区别 nohup和&的区别 Mar 18, 2024 pm 02:48 PM

在 Unix/Linux 系统中,nohup 和 && 都是用于在后台运行命令或程序的方法。nohup 更适合长时间运行的任务,因为它不受终端状态影响,可以持续执行,并可管理输出。而 && 适用于短暂的后台任务,当需要稍后检查结果时使用。

nohup命令详解 nohup命令详解 Oct 25, 2023 pm 04:20 PM

nohup是一个在Unix和类Unix系统中常用的命令,用于在后台运行命令,并且将命令的输出重定向到一个文件,即使在用户退出登录或终端关闭后仍然保持运行。nohup命令的详细解释和用法:“nohup命令 [参数] [输入文件] [输出文件]”,其中,命令 是要在后台运行的命令,参数 是命令的选项和参数,输入文件 是命令的输入文件,输出文件是命令的输出文件。

如何正确使用nohup进行后台任务处理 如何正确使用nohup进行后台任务处理 Mar 26, 2024 am 09:39 AM

如何正确使用nohup进行后台任务处理在日常工作中,我们经常需要执行一些耗时较长的任务,例如文件复制、数据处理等。为了不影响我们的工作效率,并且保证任务能够在后台稳定运行,我们可以使用nohup命令来启动这些任务。本文将介绍如何正确使用nohup进行后台任务处理。什么是nohup命令?nohup是Unix和类Unix操作系统的一个命令,用于在后台运行命令或脚

See all articles