后台挂起执行php文件

        开发的时候经常会遇到要执行的文件运行时间很长的问题。

这时,我们可以把要执行的文件放到后台调起慢慢执行。


        nohup---“运行命令,忽略挂起信号”就是不挂断的运行,注意没有后台运行功能

        &       ---   是指在后台运行,但当用户推出(挂起)的时候,命令自动也跟着退出

        那么,我们可以巧妙的吧他们结合起来用就是    nohup COMMAND &  ,这样就能使命令永久的在后台执行。例如

1. sh test.sh &
    将sh test.sh任务放到后台 ,即使关闭xshell退出当前session依然继续运行,但标准输出和标准错误信息会丢失
    
2. nohup sh test.sh
    将sh test.sh任务放到后台,关闭标准输入,前台不再能够接收任何输入(标准输入),重定向标准输出和标准错误到当前目录下的
nohup.out文件,即使关闭xshell退出当前session依然继续运行。

3. nohup sh test.sh &
    将sh test.sh任务放到后台,但是依然可以使用标准输入,前台能够接收任何输入,重定向标准输出和标准错误到当前目录下的
nohup.out文件,即使关闭xshell退出当前session依然继续运行。
ps -aux|grep chat.js
    a:显示所有程序
    u:以用户为主的格式来显示
    x:显示所有程序,不以终端机来区分
ps -aux|grep chat.js| grep -v grep
    用grep -v参数可以将grep命令排除掉
ps -aux|grep chat.js| grep -v grep | awk '{print $2}'
    再用awk提取一下进程ID

        

        监控进程:

                ps -ef | grep 进程号

        杀死进程:

                 kill -9 进程号  


        &

                当在前台运行某个作业时,终端被该作业占据;可以在命令后面加上& 实现后台运行。在用户退出登录时,就停止了

                command > out.file 2>&1 &

                这样,所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。


        nohup

                使用&命令后,作业被提交到后台运行,当前控制台没有被占用,但是一但把当前控制台关掉(退出帐户时),作业就会停止运行。nohup命令可以在你退出帐户之后继续运行相应的进程。nohup就是不挂起的意思( no hang up)。nohup不会退出。

                nohup command & 

                如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件: nohup command > myout.file 2>&1 &

                注意:使用了nohup之后,很多人就这样不管了,其实这样有可能在当前账户非正常退出或者结束的时候,命令还是自己结束了。所以在使用nohup命令后台运行命令之后,需要使用exit正常退出当前账户,这样才能保证命令一直在后台运行。


        2>&1解析

                1. command>out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。

                2. 2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个&, 是让该命令在后台执行。

                3.试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出.

nohup 命令 > outfile.log &
$comm = "nohup /usr/local/bin/php /anchorSysLog.php live {$uid} > /logs/anchor_sys.log &";
exec($comm);

nohup 命令 >> outfile.log  2>&1 &
$ex = exec("nohup /usr/local/bin/php {$process} >> /da0/logs/{$filename}.log 2>&1 &");
echo date('Y-m-d H:i:s').'restart'.PHP_EOL;






①新建2.php文件

<?php
$isDev = 'real';
if ($argc >= 2)
{
    if ($argv[1] == 'dev')
    {
        $isDev = 'dev';
        define('ENV', 2);
    }
}

$uid = isset($argv[2]) ? intval($argv[2]): 0;
echo "{$uid} \n";

$i=1;
while(1)
{
    if($i > 50)
    {
        break;
    }
    $num = $i++;
    echo $num."\n";
    sleep(5);
}

②新建1.php,调用执行2.php文件

<?php
$cmd = 'nohup /usr/local/php/bin/php '.'/usr/local/nginx/html/www.ck.com/2.php dev uid  >> /usr/local/nginx/html/www.ck.com/test.log 2>&1 &';
exec($cmd);


调起执行有三种方式。

第一种--exec():命令行模式下 执行1.php文件(后台调起执行2.php),然后从新打开一个命令行窗口,查看执行日志

        exec()----执行一个外部程序

        相关函数:shell_exec()、system、passthru 参数、返回值用法、表现形式不一样

[root@bogon www.ck.com]# php 1.php
[root@bogon www.ck.com]# tail -f test.log
0
1
2


第二种--命令行模式:不新建1.php文件,直接在命令行模式下,后台调起执行2.php文件

[root@bogon www.ck.com]# nohup /usr/local/php/bin/php 2.php dev uid >> /usr/local/nginx/html/www.ck.com/test.log 2>&1 &

查看执行文件的进程号:ps -aux | grep 2.php   (grep -v grep 是不显示grep查询这个进程

[root@bogon ~]# ps -aux | grep 2.php
root       4047  0.0  0.9 247540  9604 pts/0    S    16:18   0:00 /usr/local/php7/bin/php 2.php dev uid
root       4105  0.0  0.0 112676   992 pts/2    S+   16:19   0:00 grep --color=auto 2.php


第三种--反引号php在linux中执行外部命令(反引号的使用),新建test.php文件

<?php
$a = `nohup /usr/local/php/bin/php 2.php dev uid >> /usr/local/nginx/html/www.ck.com/test.log 2>&1 &`;
[root@bogon www.ck.com]# php test.php
[root@bogon www.ck.com]# nohup: 重定向标准错误到标准输出

冷暖自知一抹茶ck

扩展:命令行执行php文件,下载图片
①新建 test.php
<?php
$command         = `curl -s 'https://cksite.cn/Upload/image/ueditor/20180122/1516589726849116.png'`;        
$command         = trim($command);
var_dump($command);
file_put_contents('1516589726849116.png',$command);
②[root@bogon www.ck.com]#  php test.php   执行该文件,即可下载图片到本目录


扩展: linux  > 和 >> 、< 区别

>>和>都属于输出重定向,<属于输入重du定向。

大于号:将一条命令执行结果(标准输出,或者错误输出,本来都要打印到屏幕上面的)重定向其它输出设备(文件,打开文件操作符,或打印机等等)

小于号:命令默认从键盘获得的输入,改成从文件,或者其它打开文件以及设备输入

    >> 是追加内容

    > 是覆盖原有内容




相关资料:

    

    php在linux中执行外部命令

    php两种实现守护进程的方式

   nohup和&后台运行,进程查看及终止 

    如何将我的php脚本以守护进程的方式一直运行?

冷暖自知一抹茶ck
请先登录后发表评论
  • 最新评论
  • 总共0条评论