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

你们可能有这样的体验:某个程序运行的时候,会产生大量的log,但实际上咱们只想让它跑一下而已,log暂时不须要或者后面才有须要。因此在这样的状况下,咱们但愿程序可以在后台进行,也就是说,在终端上咱们看不到它所打出的log。为了实现这个需求,咱们介绍如下几种方法。shell

咱们如下面一个test程序来模拟产生大量log的程序,这个程序每隔1秒就会打印一句“Hello world!”:服务器

#include 
#include 
#include 

int main()
{
    fflush(stdout);
    setvbuf(stdout, NULL, _IONBF, 0);

    while (1) {
        printf("Hello world!\n");
        sleep(1);
    }
}

如今,咱们想要一个清静的世界,终端上不要有大量的log出现,咱们要求test程序在后台运行。网络

&##

这种方法很简单,就是在命令以后加个“&”符号就能够了,以下:人工智能

./test &code

这样一来,test程序就在后台运行了。可是,这样处理还不够,由于这样作虽然程序是在后台运行了,但log依然不停的输出到当前终端。所以,要让终端完全的清静,还应将log重定向到指定的文件:进程

./test >> out.txt 2>&1 &it

2>&1是指将标准错误重定向到标准输出,因而标准错误和标准输出都重定向到指定的out.txt文件中,今后终端完全清静了。编译

可是这样作要注意,若是Test程序须要从标准输入接收数据,它就会在那死等,不会再往下运行。因此须要从标准输入接收数据,那这种方法最好不要使用。test

那如今程序在后台运行了,咱们怎么找到它呢?很简单,有两种方法:后台

1. jobs命令

jobs命令能够查看当前有多少在后台运行。

jobs -l

此命令可显示全部任务的PID,jobs的状态能够是running, stopped, Terminated。可是若是任务被终止了(kill),shell 从当前的shell环境已知的列表中删除任务的进程标识。

2. ps命令

ps aux | grep test

nohup命令##

在命令的末尾加个&符号后,程序能够在后台运行,可是一旦当前终端关闭(即退出当前账户),该程序就会中止运行。那假如说咱们想要退出当前终端,但又想让程序在后台运行,该如何处理呢?

实际上,这种需求在现实中很常见,好比想远程到服务器编译程序,但网络不稳定,一旦掉线就编译就停止,就须要从新开始编译,很浪费时间。

在这种状况下,咱们就可使用nohup命令。nohup就是不挂起的意思( no hang up)。该命令的通常形式为:

nohup ./test &

若是仅仅如此使用nohup命令的话,程序的输出会默认重定向到一个nohup.out文件下。若是咱们想要输出到指定文件,可另外指定输出文件:

nohup ./test > myout.txt 2>&1 &

这样一来,多管齐下,既使用了nohup命令,也使用了&符号,同时把标准输出/错误重定向到指定目录下。

使用了nohup以后,不少人就这样无论了,其实这样有可能在当前帐户非正常退出或者结束的时候,命令仍是本身结束了。因此在使用nohup命令后台运行命令以后,须要使用exit正常退出当前帐户,这样才能保证命令一直在后台运行。

更多精彩内容,请关注公众号良许Linux,公众内回复1024可免费得到5T技术资料,包括:Linux,C/C++,Python,树莓派,嵌入式,Java,人工智能,等等。公众号内回复进群,邀请您进高手如云技术交流群。

img


公众号:良许Linux

有收获?但愿老铁们来个三连击,给更多的人看到这篇文章

相关文章
相关标签/搜索