AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 507408
Accepted
cbcoutinho
cbcoutinho
Asked: 2019-03-21 03:26:51 +0800 CST2019-03-21 03:26:51 +0800 CST 2019-03-21 03:26:51 +0800 CST

如何将 systemd 服务日志附加到日志中

  • 772

我正在尝试使用 systemd 控制工作站上连续运行的许可证服务器。服务本身是由一个 shell 脚本启动的,它本质上是

Usage: ./rlm_control.sh {start|stop|restart|status}

从这里我创建了一个 systemd 服务文件:

[Unit]
Description=RLM License Server
After=network.target

[Service]
Type=forking
ExecStart=/path/to/rlm_control.sh start
ExecStop=/path/to/rlm_control.sh stop
ExecReload=/path/to/rlm_control.sh restart
User=chris
Restart=on-failure

[Install]
WantedBy=multi-user.target

问题是这个控制脚本实际上用它自己的日志分叉了另一个进程rlm。的日志rlm_control.sh是由 journald 找到的,但rlm不是。

是否可以以某种方式告诉 journald 本质上将输出附加tail -f /path/to/rlm.log到该服务的日志中?

编辑:我注意到这是在 [0] 之前提出的,但该解决方案似乎建议使用命令附加日志,而不是调整服务文件以从另一个日志文件中读取。

[0]将日志从文件转发到日志

systemd systemd-journald
  • 1 1 个回答
  • 1161 Views

1 个回答

  • Voted
  1. Best Answer
    user34720
    2019-03-21T04:39:15+08:002019-03-21T04:39:15+08:00

    这里的问题是评论中已经说过的:您没有创建一个 systemd 单元,而是一个“systemd process spawner”。而且由于您谈论的是充分利用您的服务而不是将文件连接到您的日志,因此在将您的软件日志发送到 Journal 之前,您必须解决一些问题:

    • 一个真正的 systemd 单元会有类似的东西ExecStart=/path/to/license_software_bin -d parameter1 -f parameter2 -c -whatever,而不是调用一个脚本,该脚本Type=forking调用fork()并杀死启动守护进程的父进程
    • 配置PIDFile=/run/path/to/pidfile.pid以使进程识别更好。引用systemd.service手册页:

    PIDFile=

    采用引用服务 PID 文件的路径。Type=对于设置为 的服务,建议使用此选项forking。指定的路径通常指向下面的文件/run/。如果指定了相对路径,则因此以 . 为前缀/run/。服务经理将阅读PID服务启动后,从这个文件中获取服务的主进程。服务管理器不会写入此处配置的文件,但如果该文件仍然存在,它会在服务关闭后删除该文件。PID 文件不需要由特权用户拥有,但如果它由非特权用户拥有,则会强制执行额外的安全限制:该文件可能不是其他用户拥有的文件的符号链接(直接或间接) ,并且 PID 文件必须引用已经属于该服务的进程。

    和:

    如果设置为forking,则预计配置为的进程 ExecStart=将fork()作为其启动的一部分进行调用。当启动完成并设置所有通信通道时,父进程将退出。子进程作为主服务进程继续运行,当父进程退出时服务管理器会认为该单元启动。这是传统 UNIX 服务的行为。如果使用此设置,建议也使用该PIDFile=选项,以便 systemd 能够可靠地识别服务的主进程。一旦父进程退出,systemd 将继续启动后续单元。

    看看httpd.serviceCentOS 7 的 systemd 单元的设计简单性:ExecStart=直接调用二进制文件,因此PIDFile=不需要,通过终止进程并给它一些时间来停止SIGCONT并TimeoutStopSec重新加载使用httpd -k gracefulApache 本身特有的东西。

    [Unit]
    Description=The Apache HTTP Server
    After=network.target remote-fs.target nss-lookup.target
    Documentation=man:httpd(8)
    Documentation=man:apachectl(8)
    
    [Service]
    Type=notify
    EnvironmentFile=/etc/sysconfig/httpd
    ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
    ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
    ExecStop=/bin/kill -WINCH ${MAINPID}
    # We want systemd to give httpd some time to finish gracefully, but still want
    # it to kill httpd after TimeoutStopSec if something went wrong during the
    # graceful stop. Normally, Systemd sends SIGTERM signal right after the
    # ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
    # httpd time to finish.
    KillSignal=SIGCONT
    PrivateTmp=true
    
    [Install]
    WantedBy=multi-user.target
    
    • 2

相关问题

  • journalctl 中的区分级别

  • 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _

  • systemd:如何在服务启动时运行脚本,而不编辑服务定义

  • 使用 systemd 看门狗支持重新启动应用程序

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve