当前位置: 首页 > Linux

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

时间:2023-04-06 21:52:04 Linux

你可能有这样的经历:某个程序在运行的时候会产生很多日志,其实我们只是想让它运行一会儿,log暂时不需要或者以后会用到。所以在这种情况下,我们希望程序能够在后台运行,也就是说,我们是看不到它在终端上打印的日志的。为了达到这个要求,我们引入以下方法。我们使用下面的测试程序来模拟一个产生大量日志的程序。该程序将打印“Helloworld!”每秒:#include#include#includeintmain(){fflush(stdout);setvbuf(stdout,NULL,_IONBF,0);while(1){printf("Helloworld!\n");睡觉(1);}}现在,我们想要一个安静的世界,不要在终端上有大量的日志,我们的测试程序需要在后台运行。&这种方法很简单,只需要在命令后加一个“&”符号即可,如下:./test&这样,测试程序就会在后台运行。但是这样处理还不够,因为虽然程序在后台运行,但是日志还是源源不断的输出到当前终端。因此,要让终端完全安静,还应该将日志重定向到指定文件:./test>>out.txt2>&1&2>&1指的是将标准错误重定向到标准输出,所以标准错误和标准输出被重定向到指定的out.txt文件,终端从此完全安静。但是这样做的时候要小心,如果Test程序需要从标准输入接收数据,它会在那里等待,不会再运行了。所以你需要从标准输入接收数据,那么这个方法最好不要使用。既然程序是在后台运行的,那我们怎么找到呢?很简单,有两个方法:1.jobs命令jobs命令可以查看当前后台运行了多少个job。jobs-l这个命令可以显示所有任务的PID,可以显示jobs的状态是running,stopped,terminated。但是如果任务被终止(kill),shell会从当前shell环境已知的列表中删除任务的进程ID。2.ps命令psaux|后greptestnohup命令在命令末尾添加一个&符号,程序可以在后台运行,但是一旦关闭当前终端(即退出当前账号),程序就会停止运行。那么如果我们想退出当前终端,但又想让程序在后台运行,应该怎么处理呢?其实这种需求在现实中是很常见的。比如你想远程编译一个程序到服务器,但是网络不稳定,一旦断开连接,编译就会停止,需要重新开始编译,很浪费时间。在这种情况下,我们可以使用nohup命令。nohup表示不挂断(nohangup)。这条命令的一般形式是:nohup./test&如果只这样使用nohup命令,程序的输出默认会重定向到一个nohup.out文件。如果我们要输出到指定的文件,也可以指定一个输出文件:nohup./test>myout.txt2>&1&这样我们就同时使用了nohup命令和&符号,把标准输出/错误重定向到指定目录。很多人用了nohup之后就直接忽略了。事实上,当当前账户退出或非正常结束时,命令可能会自行结束。因此,使用nohup命令后台运行命令后,需要使用exit正常退出当前账号,以保证命令一直在后台运行。更多精彩内容,关注公众号良旭Linux,在公众号回复1024免费领取5T技术资料,包括:Linux、C/C++、Python、树莓派、嵌入式、Java、人工智能等。公众号回复加群,邀你加入达人如云技术交流群。最后,最近有很多朋友找我要一份Linux学习路线图,所以我结合自己的经验,利用业余时间熬夜一个月,整理了一本电子书。无论你是面试还是自我提升,相信都会对你有所帮助!免费送给大家,只求大家给我点个赞!电子书|LinuxDevelopmentLearningRoadmap也希望有小伙伴可以和我一起把这本电子书做得更完美!获得?希望老铁们来个三连击,让更多人看到这篇文章。推荐阅读:干货|程序员和高级架构师免费发送工件的必备资源|支持搜索的资源网站