Hexo

凡事预则立,不预则废


  • Home

  • Tags

  • Archives

  • Navigation

  • Search

Linux——Logstash时区问题

有时候Linux系统重启或者有修改后会造成时区被修改,默认一般是UTC时间,有时候会变成CST时间
在阿里云主机扩展后出现过一次,造成了Logstash 使用JDBC连接数据库时读取报错:大概是JavaLang::IllegalArgumentException: HOUR_OF_DAY: 2 -> 3这样的错


解决方案:

改系统时区

  • 将系统的时区改回去,然后重启
    1
    2
    3
    4
    # 修改时区命令:	
    timedatectl set-timezone UTC
    # 重启命令:
    shutdown -r now

重启后继续运行之前出错的程序,成功解决问题

链接时加参数

  • 在连接mysql-connector时加上一个时区参数

  • 以logstash为例子

    • 在mysql.config中修改连接语句原来为(连接到名称为”docker“的数据库,但是没有指定参数)

      1
      jdbc:mysql://localhost:3306/docker
    • 修改后连接语句为(制定参数为UTC)

      1
      jdbc:mysql://localhost:3306/docker?serverTimezone=UTC

注意,这种方式修改后我的系统时区可为任意的,比如我的系统时区就一直为CST

替换JDBC版本【未测试】

  • 网上有博客指出可以通过换jdbc connector的版本解决问题

Linux——exec命令的使用


整体说明

  • Linux Shell 脚本中,exec 命令用于在当前 shell 进程中执行指定的命令,而不是启动一个新的子进程

  • exec 常常用来替换当前 shell 进程,或者重定向文件描述符

  • exec 基本语法如下:

    1
    exec 命令 [参数...]
    • 执行后,当前 shell 进程会被新命令替换,原 shell 脚本后续的内容将不会再执行

exec 替换进程用法

  • 假如在脚本中写:

    1
    2
    3
    4
    #!/bin/bash
    echo "Before exec"
    exec ls -l
    echo "After exec"
    • 输出只会有 “Before exec” 和 ls -l 的结果,而不会有 “After exec”,因为 exec ls -l 之后,脚本所在的 shell 进程已经被 ls 取代,后续语句不会执行

exec 实现文件描述符重定向

  • exec 也常用于重定向输入输出,不会启动新进程,而是改变当前 shell 的文件描述符。例如:

    • 将标准输出重定向到文件:

      1
      2
      exec > output.txt
      echo "This will go to output.txt"
      • 这样,后续所有标准输出都会写入 output.txt 文件
    • 将标准输入重定向为某个文件:

      1
      2
      3
      exec < input.txt
      read line
      echo $line
      • 这样,read 命令会从 input.txt 读取内容
    • 关闭文件描述符:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      # 打开一个文件用于读取,赋予文件描述符3
      exec 3< myfile.txt

      # 通过文件描述符3读取一行
      read line <&3
      echo "读取到的内容: $line"

      # 关闭文件描述符3
      exec 3<&-
      • 这表示关闭文件描述符 3
1…338339340…352
San Ye

San Ye

Stay Hungry. Stay Foolish.

704 posts
53 tags
© 2026 San Ye
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4