最近搞 Flume,程序需要后台不间断运行,于是就搞了命令写成脚本,所有的日志也一并输出到同一个文件中,但是问题来了,这个日志越来越大,造成磁盘报警,就想着把日志管理起来,起初使用的 logrotate,但是后来发现这鬼有个缺陷(使用 copytruncate),就是大量的日志写入日志文件的时候突然间,需要把这个文件的所有内容拷贝到另外一个文件中,然后清空当前日志文件,因为日志量是在是太大,所以就在 copy 和 truncate 之间,就有部分日志丢失,为了解决这个问题,还是回归到 Flume 自带的 log4j 上,然而新的问题来了如果我使用 nohup 命令中没有日志的重定向,就需要敲回车。。。今天具体查了一下,也测试了一下记录下来
-
之前使用的Flume 启动脚本
#!/bin/sh nohup /usr/libra/flume/bin/flume-ng agent -n agent-wechat -c /usr/libra/flume/conf -f /usr/libra/flume/conf/flume-kafka-hdfs-wechat.properties -Dflume.root.logger=INFO,console >>/usr/libra/flume/logs/flume-wechat.log 2>&1 &
- 这个启动脚本就是把包括 flume 和 nohup 在内的所有日志输出重定向到
flume-wechat.log
中,2>&1
的意思就是错误信息也重定向到标准输出中,需要注意的是这几个字符间不要有空格,否则会出现意想不到的情况(我也没有仔细去研究什么原因) - nohup:
Run COMMAND, ignoring hangup signals.
即:运行命令,忽略挂起信号
,其意思就是:用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思,忽略所有发给这个程序的挂起信息(我们可以使用很多手段向程序发出挂起操作) - &:后台运行,但当用户退出终端(挂起)的时候,命令自动也跟着退出
- 网上找到一个很好的解释(自己粘贴一段搜索一下,简书会屏蔽贴其他博客的帖子):
- nohup 应对的就是突然断网或者关闭终端时屏蔽发送给后台任务的 SIGHUP 信号进而使任务不中断继续运行。
- exit 或者 logout 命令正常退出的话根本用不着 nohup,你的 & 运行的命令都不会被中断。不信你可以 command & 后 exit,再次登录,ps 查看一下命令肯定还在后台跑。
- 简单来说,如果你使用的是 exit 或者 logout 命令正常登出,系统只会向前台任务发送 SIGHUP 信号,& 到后台的任务时不会收到 SIGHUP 信号的。如果你强行关闭的窗口或者断网了,系统会向你的前后台任务都发送 SIGHUP 信号,此时如果使用了 nohup 去运行任务,nohup 会屏蔽 SIGHUP 信号,任务也就不会被中断了。
- 这个启动脚本就是把包括 flume 和 nohup 在内的所有日志输出重定向到
-
经过摸索的启动脚本:
#!/bin/sh nohup /usr/libra/flume/bin/flume-ng agent -n agent-wechat -c /usr/libra/flume/conf-wechat -f /usr/libra/flume/conf-wechat/flume-kafka-hdfs-wechat.properties > /dev/null 2>&1 &
- 这个脚本中去掉了通过 jvm 传递的一些参数,并且把 nohup 的日志数据重定向到 null 设备中