nohup 不输出日志文件方法
admin
2024-02-10 00:35:00

这里写目录标题

  • 1. nohup 不输出日志文件方法
    • 1.1. 场景描述
    • 1.2. 解决思路
    • 1.3. 操作示例
    • 1.4. 关于 Linux 的重定向
  • 2. linux 后台执行命令: & 与 nohup 的用法
    • 2.1. &
    • 2.2. nohup 命令

1. nohup 不输出日志文件方法

1.1. 场景描述

nohup 启动程序时, 会在当前的目录下生成 nohup.log 文件。这样就会在很短的时间内将磁盘全部写满(当时的磁盘是 100G, 全部写满), 导致别的程序无法正常运行。(如启动: Jenkins 等)
那么如何让 nohup 命令不产生大量的日志文件呢

1.2. 解决思路

既然 nohup 会输出大量的日志。那如何让 nohup 不输出日志呢?
查了很多的资料发现没办法让 nohup 不输出日志。但是可以 利用 liunx 的黑洞 /dev/null, 它就像一个无底洞, 所有重定向到它的信息都会消失得无影 无踪。这一点非常有用, 当我们不需要回显程序的所有信息时, 就可以将输出重定向到 /dev/null

/dev/null
  • /dev/null: 在类 Unix 系统中, /dev/null, 或称空设备, 是一个特殊的设备文件, 它丢弃一切写入其中的数据(但报告写入操作成功), 读取它则会立即得到一个 EOF。
    在程序员行话, 尤其是 Unix 系统中, /dev/null 被称为位桶 (bit bucket) 或者黑洞 (black hole)。空设备通常被用于丢弃不需要的输出流, 或作为用于输入流的空文件。当你读它的时候, 它会提供无限的空字符 (NULL, ASCII NUL, 0x00)。

1.3. 操作示例

nohup java -cp WEB-INF/lib/*:WEB-INF/classes org.b3log.solo.Starter >/dev/null 2>&1 &
  • >/dev/null 将信息输出到 /dev/null
  • 2>&1 将错误信息重定向到标准输出
  • 最后一个 & 符号, 表示程序在后台运行

1.4. 关于 Linux 的重定向

  • 0: 表示标准输入
  • 1: 标准输出, 在一般使用时, 默认的是标准输出
  • 2: 标准错误信息输出

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

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

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

#include int main()
{fflush(stdout);setvbuf(stdout, NULL, _IONBF, 0);while (1) {printf("Hello world!\n");sleep(1);}
}

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

2.1. &

这种方法很简单, 就是在命令之后加个 “&” 符号就可以了, 如下:

./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 环境已知的列表中删除任务的进程标识。

  1. ps 命令
ps aux | grep test

2.2. nohup 命令

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

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

在这种情况下, 我们就可以使用 nohup 命令。nohup 就是不挂起的意思 ( no hang up)。该命令的一般形式为:

nohup ./test &

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

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

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

使用了 nohup 之后, 很多人就这样不管了, 其实这样有可能在当前账户非正常退出或者结束的时候, 命令还是自己结束了。所以在使用 nohup 命令后台运行命令之后, 需要使用 exit 正常退出当前账户, 这样才能保证命令一直在后台运行。

相关内容

热门资讯

赤水性价比粮食酒推荐:2025... 赤水性价比粮食酒推荐:2025年酱香酒选购全攻略 一、开篇背景与市场痛点 2025年的赤水河流域酒类...
非白酒板块11月19日跌0.3... 证券之星消息,11月19日非白酒板块较上一交易日下跌0.33%,*ST椰岛领跌。当日上证指数报收于3...
以运河文化赋能产业发展|古贝春... 11月17日至19日,以“新质开新局,聚力创未来”为主题的2025年第六届中国白酒黄淮核心产区高质量...
深夜小酌的灵魂搭档:油炝脆骨,... 油炝脆骨是一道充满锅气与烟火气息的家常菜,以其爽脆的口感和浓郁的香辣风味深受许多人喜爱。这道菜的制作...
初中毕业新征程:为什么西点烘焙... 站在初中毕业的人生路口,许多女孩都在思考:哪条路能通往一个既美好又独立的未来?如果有一条道路,能将女...