我有以下几点。

  • 将日志写入标准输出
  • 的Java进程
  • 一个启动Java进程的shell脚本
  • 另一个执行上一个脚本并重定向日志
  • 的shell脚本
  • 我使用tail -f命令检查日志文件中的成功消息。

  • 即使代码中的导出为0,也无法结束tail -f进程。

    这不能让我的脚本完成。在Bash中还有其他方法可以这样做吗?

    该代码如下所示。
    function startServer() {
      touch logfile
      startJavaprocess > logfile &
    
      tail -f logfile | while read line
      do
        if echo $line | grep -q 'Started'; then
          echo 'Server Started'
          exit 0
        fi
      done
    }
    

    最佳答案

    我能想到的最好的答案是

  • 在读取的tail -f logfile | read -t 30 line
  • 上设置超时
  • --pid=$$开头tail,这样它将在bash进程完成后退出。

  • 它涵盖了我能想到的所有情况(服务器挂起,没有输出,服务器退出,服务器正常启动)。

    不要忘记在服务器之前启动自己的尾巴。
    tail -n0 -F logfile 2>/dev/null | while read -t 30 line
    

    即使文件不存在,-F也会“读取”文件(出现时开始读取文件)。 -n0不会读取文件中的任何内容,因此您可以继续追加到日志文件中,而不必每次都覆盖它,并可以对其进行标准日志轮转。

    编辑:
    好吧,如果您使用的是尾巴,那么这是一个粗略的“解决方案”。除尾巴外,可能还有其他更好的解决方案,但我必须将其提供给您,尾巴可以很好地将您从残管中解脱出来。能够处理SIGPIPE的“tee”可能会更好。主动执行文件系统删除并带有某种“im alive”消息的java进程可能更容易等待。
    function startServer() {
      touch logfile
    
      # 30 second timeout.
      sleep 30 &
      timerPid=$!
    
      tail -n0 -F --pid=$timerPid logfile | while read line
      do
        if echo $line | grep -q 'Started'; then
          echo 'Server Started'
          # stop the timer..
          kill $timerPid
        fi
      done &
    
      startJavaprocess > logfile &
    
      # wait for the timer to expire (or be killed)
      wait %sleep
    }
    

    关于bash - 以shell脚本开始的结尾tail -f,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2041437/

    10-13 04:55