用 nohup 启动程序时, 会在当前的目录下生成 nohup.log 文件。这样就会在很短的时间内将磁盘全部写满(当时的磁盘是 100G, 全部写满), 导致别的程序无法正常运行。(如启动: Jenkins 等)
那么如何让 nohup 命令不产生大量的日志文件呢
既然 nohup 会输出大量的日志。那如何让 nohup 不输出日志呢?
查了很多的资料发现没办法让 nohup 不输出日志。但是可以 利用 liunx 的黑洞 /dev/null, 它就像一个无底洞, 所有重定向到它的信息都会消失得无影 无踪。这一点非常有用, 当我们不需要回显程序的所有信息时, 就可以将输出重定向到 /dev/null。
/dev/null
/dev/null: 在类 Unix 系统中, /dev/null, 或称空设备, 是一个特殊的设备文件, 它丢弃一切写入其中的数据(但报告写入操作成功), 读取它则会立即得到一个 EOF。/dev/null 被称为位桶 (bit bucket) 或者黑洞 (black hole)。空设备通常被用于丢弃不需要的输出流, 或作为用于输入流的空文件。当你读它的时候, 它会提供无限的空字符 (NULL, ASCII NUL, 0x00)。nohup java -cp WEB-INF/lib/*:WEB-INF/classes org.b3log.solo.Starter >/dev/null 2>&1 &
>/dev/null 将信息输出到 /dev/null2>&1 将错误信息重定向到标准输出& 符号, 表示程序在后台运行大家可能有这样的体验: 某个程序运行的时候, 会产生大量的 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 程序在后台运行。
这种方法很简单, 就是在命令之后加个 “&” 符号就可以了, 如下:
./test &
这样一来, test 程序就在后台运行了。但是, 这样处理还不够, 因为这样做虽然程序是在后台运行了, 但 log 依然不停的输出到当前终端。因此, 要让终端彻底的清静, 还应将 log 重定向到指定的文件:
./test >> out.txt 2>&1 &
2>&1 是指将标准错误重定向到标准输出, 于是标准错误和标准输出都重定向到指定的 out.txt 文件中, 从此终端彻底清静了。
但是这样做要注意, 如果 Test 程序需要从标准输入接收数据, 它就会在那死等, 不会再往下运行。所以需要从标准输入接收数据, 那这种方法最好不要使用。
那现在程序在后台运行了, 我们怎么找到它呢? 很简单, 有两种方法:
jobs 命令可以查看当前有多少在后台运行。
jobs -l
此命令可显示所有任务的 PID, jobs 的状态可以是 running, stopped, Terminated。但是如果任务被终止了(kill), shell 从当前的 shell 环境已知的列表中删除任务的进程标识。
ps aux | grep test
在命令的末尾加个 & 符号后, 程序可以在后台运行, 但是一旦当前终端关闭(即退出当前帐户), 该程序就会停止运行。那假如说我们想要退出当前终端, 但又想让程序在后台运行, 该如何处理呢?
实际上, 这种需求在现实中很常见, 比如想远程到服务器编译程序, 但网络不稳定, 一旦掉线就编译就中止, 就需要重新开始编译, 很浪费时间。
在这种情况下, 我们就可以使用 nohup 命令。nohup 就是不挂起的意思 ( no hang up)。该命令的一般形式为:
nohup ./test &
如果仅仅如此使用 nohup 命令的话, 程序的输出会默认重定向到一个 nohup.out 文件下。如果我们想要输出到指定文件, 可另外指定输出文件:
nohup ./test > myout.txt 2>&1 &
这样一来, 多管齐下, 既使用了 nohup 命令, 也使用了&符号, 同时把标准输出/错误重定向到指定目录下。
使用了 nohup 之后, 很多人就这样不管了, 其实这样有可能在当前账户非正常退出或者结束的时候, 命令还是自己结束了。所以在使用 nohup 命令后台运行命令之后, 需要使用 exit 正常退出当前账户, 这样才能保证命令一直在后台运行。
下一篇:高斯分布的乘积与卷积