开发的时候经常会遇到要执行的文件运行时间很长的问题。
这时,我们可以把要执行的文件放到后台调起慢慢执行。
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