当前位置: 首页 > 科技观察

linux后台执行命令:&和nohup的用法

时间:2023-03-17 00:11:10 科技观察

你可能有这样的经历:某个程序在运行的时候会产生很多日志,其实我们只是想让它运行一会儿,而日志暂时不需要或者以后需要。所以在这种情况下,我们希望程序能够在后台运行,也就是说,我们是看不到它在终端上打印的日志的。为了达到这个要求,我们引入以下方法。我们使用下面的测试程序来模拟一个产生大量日志的程序。该程序将打印“Helloworld!”每秒:#include#include#includeintmain(){fflush(stdout);setvbuf(stdout,NULL,_IONBF,0);while(1){printf("Helloworld!\n");sleep(1);}}现在,我们想要一个安静的世界,终端上不应该有很多日志,我们要求测试程序运行在的背景。#####这个方法很简单,只需要在命令后加一个“&”符号即可,如下:./test&这样,测试程序就会在后台运行。但是这样处理还不够,因为虽然程序在后台运行,但是日志还是源源不断的输出到当前终端。因此,要让终端完全安静,还应该将日志重定向到指定文件:./test>>out.txt2>&1&2>&1指的是将标准错误重定向到标准输出,所以无论是标准错误还是标准输出重定向到指定的out.txt文件,终端从此完全安静。但是这样做的时候要小心,如果Test程序需要从标准输入接收数据,它会在那里等待,不会再运行了。所以你需要从标准输入接收数据,那么这个方法最好不要使用。既然程序是在后台运行的,那我们怎么找到呢?很简单,有两个方法:1.jobs命令jobs命令可以查看当前有多少程序在后台运行。jobs-l该命令可以显示所有任务的PID,作业的状态可以是running、stopped、terminated。但是如果任务被终止(kill),shell会从当前shell环境已知的列表中删除任务的进程ID。2.ps命令psaux|greptest##nohup命令##在命令末尾添加&符号后,程序可以在后台运行,但是一旦关闭当前终端(即退出当前账号),该程序将停止运行。那么如果我们想退出当前终端但又想让程序在后台运行怎么办呢?其实这个需求在现实中是很常见的。比如我们想远程编译一个程序到服务器,但是网络不稳定,一旦离线编译就停止了,需要重新编译,很浪费时间。在这种情况下,我们可以使用nohup命令。nohup表示不挂断(nohangup)。这个命令的一般形式是:nohup./test&如果只这样使用nohup命令,程序的输出默认会重定向到一个nohup.out文件。如果我们要输出到指定的文件,也可以指定一个输出文件:nohup./test>myout.txt2>&1&这样我们就同时使用了nohup命令和&符号来输出标准输出/错误重定向到指定目录。很多人用了nohup之后就直接忽略了。事实上,当当前账户退出或非正常结束时,命令可能会自行结束。因此,使用nohup命令后台运行命令后,需要使用exit正常退出当前账号,以保证命令一直在后台运行。本文经授权转载自公众号“良墟Linux”。世界500强外企Linux开发工程师梁旭,在公众号分享大量Linux干货,欢迎关注!