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 / 问题 / 771720
Accepted
Sybil
Sybil
Asked: 2024-03-06 16:28:54 +0800 CST2024-03-06 16:28:54 +0800 CST 2024-03-06 16:28:54 +0800 CST

如何在 systemd 单元文件中指定动态“环境”变量?

  • 772

这$(ls -d...)在 systemd 单元文件中不起作用:

[Service]
Type=forking
Environment="ORACLE_HOME=$(ls -d /usr/lib/oracle/*/client64 | sort -rV | head -n1)"
Environment="TNS_ADMIN=$(ls -d /usr/lib/oracle/*/client64/lib/network/admin | sort -rV | head -n1)"

我想避免对 Oracle 客户端版本(目前为 19.19)进行硬编码,以简化更新。当我安装新的 Oracle 客户端时,我不想修改 systemd 单元文件。

我怎样才能做到这一点?如果重要的话我使用 RHEL9。

systemd
  • 1 1 个回答
  • 219 Views

1 个回答

  • Voted
  1. Best Answer
    u1686_grawity
    2024-03-07T01:13:13+08:002024-03-07T01:13:13+08:00

    最常见的方法:

    • 使用EnvironmentFile=动态生成的,例如通过调用简单脚本的 ExecStartPre= 。当前的 systemd 版本将在每次执行之前重新读取 EnvironmentFile 以允许其工作。(/run 是存放临时文件的好位置。)

      这是最简单的方法,因为脚本只需要写出这些KEY="value"行。

    • 使用 systemd生成器,每次(重新)加载配置时,它都会在 /run/systemd 动态写入单元文件。生成器可以是 shell 脚本,只要它仅限于本地文件系统访问。

      发电机可以放置在/etc/systemd/system-generators/;它们将在每次启动和每次“systemctl daemon-reload”期间运行,获取输出路径为$1. 它们实际上会在任何单元启动之前运行,因此它们不能期望网络或其他任何东西都会启动。

      这是最灵活的方法,因为任何单位选项都可以动态指定 - 不仅是环境,还包括其他内容,例如WorkingDirectory=。(生成器不需要创建整个单元;它可以通过创建$1/oracle.service.d/environ.conf或类似的方式以通常的方式扩展现有单元。)

    其他方法:

    • [email protected]使用一个实例化的服务单元%i来填充版本。您仍然需要禁用“oracle@old”并启用“oracle@new”,但它可以节省您打开文本编辑器的时间。(而且它还可以通过启动正确的单元轻松快速回滚到旧版本。)我认为您可以拥有一个Alias=oracle.service,以便启用实例会自动将其映射到较短的名称。

    • 使用包装 shell 脚本来设置变量并exec保存实际程序。是的,这exec很重要。(另外,使用 SyslogIdentifier= 来防止脚本的名称显示 Journalctl 输出。)通常不鼓励使用包装器脚本,但这通常是因为它们执行的操作可以通过 .service 轻松完成,但这里的情况并非 100%。

    避免systemctl set-environment,因为它是全局的 - 变量将可供该点之后启动的所有服务使用,无论它们是否想要它们。

    • 6

相关问题

  • 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