开发的时候经常会遇到要执行的文件运行时间很长的问题。
这时,我们可以把要执行的文件放到后台调起慢慢执行。
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: 重定向标准错误到标准输出
扩展:命令行执行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定向。
大于号:将一条命令执行结果(标准输出,或者错误输出,本来都要打印到屏幕上面的)重定向其它输出设备(文件,打开文件操作符,或打印机等等)
小于号:命令默认从键盘获得的输入,改成从文件,或者其它打开文件以及设备输入
>> 是追加内容
> 是覆盖原有内容
相关资料:
本文为崔凯原创文章,转载无需和我联系,但请注明来自冷暖自知一抹茶ckhttp://www.cksite.cn