后台程序在处理繁重的任务时,调用外部程序异步执行的简单实现 (2)

所以,文章开头提到的命令中的 > /dev/null 2>&1,就是用来重定向标准输出和标准错误,将其写入 /dev/null 文件的,以使得宿主程序在调用外部程序,让其后台运行后,自己会立刻执行后续代码,直到结束,可以很快的结束自己的生命周期,而此时,外部程序,还正在默默的努力运行中。

当我在写这篇文章之前,还特意查了一下,在Java下用Runtime.exec()调用外部程序的实现方式,发现有篇文章提到了这样一点:

后台程序在处理繁重的任务时,调用外部程序异步执行的简单实现

意思也是要将外部程序的输出重定向出来,这与PHP官方手册中提到的注意事项,完全一致。

具体实现

下面,我们就来解释一下 nohup 要执行的命令 > /dev/null 2>&1 & 这条命令的含义。

首先,是 要执行的命令,比如我上文提到的,调用百度AI,进行内容审核,那么命令就像 php /www/wwwroot/app_service/artisan baidu:censor 文章ID 这样,我这里用的PHP的Laravel框架,至于你用什么语言,什么框架,怎么写这个 要执行的命令,也要视你的情况而定。

其次,要让一个程序,在后台运行,需要在命令后面加上 &【也就是末尾的 &】,以告诉系统,我要执行的命令,是一个需要后台运行的程序。

然后,为了防止我们的宿主程序等待挂起,我们需要重定向外部程序的输出,于是就加上了 > /dev/null 2>&1,> /dev/null 是指将标准输出重定向到 /dev/null 文件,而后面的 2>&1 是指,将标准错误也重定向到跟前面标准输出一样的位置。而 /dev/null 是一个不存在的文件,所以 > /dev/null 2>&1 的整体意思是,这个外部程序执行时,他产生的所有标准输出和标准错误【就是报错信息】,统统不要保存,我不要看到。当然,如果你在调用外部程序后,发现没有按预期执行,可能是这个外部程序报错了,你可以将输出,重定向到一个真实的文件,以保存外部程序的输出信息,便于你排错。

最后,是 nohup。当你通过指定 & 让外部程序在后台运行后,如果此时你关闭、退出你的 terminal 终端【就是黑乎乎的命令行窗口】,那么此时你刚刚正在后台运行的外部程序,也会终止。为了避免这个问题,需要在开头加上 nohup,来告诉系统,关闭、退出终端时,别把我刚刚执行的外部程序的这个后台进程杀掉啊!!!

好了,具体实现要用到的命令,解释清楚了,那在各个语言中,如何实现呢?这个,我相信各个语言中,都有调用外部程序的方式,你可以自己研究下。我用PHP多一点,最后就贴一下PHP的实现方法:

exec('nohup php /www/wwwroot/app_service/artisan baidu:censor 文章ID > /dev/null 2>&1 &');【Laravel】

exec('nohup php /www/wwwroot/app_service/baidu_censor.php 文章ID > /dev/null 2>&1 &');

参考文章

java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现

详解nohup和& 区别

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwjzpf.html