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

简介: 大家可能有这样的体验:某个程序运行的时候,会产生大量的log,但实际上我们只想让它跑一下而已,log暂时不需要或者后面才有需要。所以在这样的情况下,我们希望程序能够在后台进行,也就是说,在终端上我们看不到它所打出的log。

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

我们以下面一个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 &
这样一来,test程序就在后台运行了。但是,这样处理还不够,因为这样做虽然程序是在后台运行了,但log依然不停的输出到当前终端。因此,要让终端彻底的清静,还应将log重定向到指定的文件:

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

2>&1是指将标准错误重定向到标准输出,于是标准错误和标准输出都重定向到指定的out.txt文件中,从此终端彻底清静了。

但是这样做要注意,如果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正常退出当前账户,这样才能保证命令一直在后台运行。

原文发布时间为:2018-09-21

原文作者: 良许

本文来自云栖社区合作伙伴“良许Linux”,了解相关信息可以关注“良许Linux”。

相关文章
|
2天前
|
机器学习/深度学习 缓存 监控
linux查看CPU、内存、网络、磁盘IO命令
`Linux`系统中,使用`top`命令查看CPU状态,要查看CPU详细信息,可利用`cat /proc/cpuinfo`相关命令。`free`命令用于查看内存使用情况。网络相关命令包括`ifconfig`(查看网卡状态)、`ifdown/ifup`(禁用/启用网卡)、`netstat`(列出网络连接,如`-tuln`组合)以及`nslookup`、`ping`、`telnet`、`traceroute`等。磁盘IO方面,`iostat`(如`-k -p ALL`)显示磁盘IO统计,`iotop`(如`-o -d 1`)则用于查看磁盘IO瓶颈。
|
1天前
|
Linux 数据安全/隐私保护
Linux常用命令实例带注释
Linux常用命令实例带注释
13 0
|
1天前
|
Linux 开发工具 数据安全/隐私保护
Linux(19)常用解压命令记录
Linux(19)常用解压命令记录
6 0
|
2天前
|
Linux Perl
Linux系统替换字符串常用命令
请注意,`sed`命令可以非常强大,可以根据不同的需求使用不同的选项和正则表达式来进行更复杂的字符串替换操作。
16 0
|
5天前
|
安全 Linux 开发工具
Linux中可引起文件时间戳改变的相关命令
【4月更文挑战第12天】Linux中可引起文件时间戳改变的相关命令
12 0
|
6天前
|
域名解析 网络协议 Linux
Linux 中的 Nslookup 命令怎么使用?
【4月更文挑战第12天】
25 6
Linux 中的 Nslookup 命令怎么使用?
|
7天前
|
运维 网络协议 Unix
18.系统知识-Linux常用命令
18.系统知识-Linux常用命令
|
8天前
|
网络协议 Ubuntu Linux
Linux 下 TFTP 服务搭建及 U-Boot 中使用 tftp 命令实现文件下载
Linux 下 TFTP 服务搭建及 U-Boot 中使用 tftp 命令实现文件下载
|
8天前
|
Linux Go
Linux命令Top 100驱动人生! 面试必备
探索Linux命令不再迷茫!本文分10部分详解20个基础命令,带你由浅入深掌握文件、目录管理和文本处理。 [1]: <https://cloud.tencent.com/developer/article/2396114> [2]: <https://pan.quark.cn/s/865a0bbd5720> [3]: <https://yv4kfv1n3j.feishu.cn/docx/MRyxdaqz8ow5RjxyL1ucrvOYnnH>
63 0
|
11天前
|
缓存 运维 监控
Linux系统监控利器:探索常用命令及数据保存技巧
Linux系统监控利器:探索常用命令及数据保存技巧
29 4
Linux系统监控利器:探索常用命令及数据保存技巧