[Linux-CMD] nohup &

2019-08-24  本文已影响0人  帅可儿妞

最近搞 Flume,程序需要后台不间断运行,于是就搞了命令写成脚本,所有的日志也一并输出到同一个文件中,但是问题来了,这个日志越来越大,造成磁盘报警,就想着把日志管理起来,起初使用的 logrotate,但是后来发现这鬼有个缺陷(使用 copytruncate),就是大量的日志写入日志文件的时候突然间,需要把这个文件的所有内容拷贝到另外一个文件中,然后清空当前日志文件,因为日志量是在是太大,所以就在 copy 和 truncate 之间,就有部分日志丢失,为了解决这个问题,还是回归到 Flume 自带的 log4j 上,然而新的问题来了如果我使用 nohup 命令中没有日志的重定向,就需要敲回车。。。今天具体查了一下,也测试了一下记录下来

  1. 之前使用的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 信号,任务也就不会被中断了。
  2. 经过摸索的启动脚本:

    #!/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 设备中
上一篇下一篇

猜你喜欢

热点阅读