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 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

노흡의 기능 및 원리 분석 노흡의 기능 및 원리 분석 Mar 25, 2024 pm 03:24 PM

nohup의 역할과 원리 분석 nohup은 유닉스 및 유닉스 계열 운영체제에서 사용자가 현재 세션을 종료하거나 터미널 창을 닫아도 백그라운드에서 명령을 실행하는 데 일반적으로 사용되는 명령입니다. 아직도 계속 처형되고 있다. 이번 글에서는 nohup 명령의 기능과 원리를 자세히 분석해보겠습니다. 1. 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 18, 2024 pm 02:48 PM

Unix/Linux 시스템에서 nohup과 &&는 모두 백그라운드에서 명령이나 프로그램을 실행하는 데 사용되는 방법입니다. nohup은 터미널 상태에 영향을 받지 않고 계속 실행이 가능하며 출력을 관리할 수 있기 때문에 장기 실행 작업에 더 적합합니다. &&는 단기 백그라운드 작업에 적합하지만 나중에 결과를 확인해야 할 때 사용됩니다.

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 명령에 대한 자세한 설명 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