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 / 问题 / 758558
Accepted
Alex Martian
Alex Martian
Asked: 2023-10-10 19:41:41 +0800 CST2023-10-10 19:41:41 +0800 CST 2023-10-10 19:41:41 +0800 CST

如何确保 bash 脚本在 systemd 服务启动之前完成?

  • 772

我希望 bash 脚本在某个服务之前完成systemd其工作(而不仅仅是启动) ,据我所知,该解决方案涉及在其自己的服务完成之前完成。

网络搜索可以找到有关如何开始的问题。据我了解,Before=选择是等到设备启动。因此阅读时man systemd.service我只看到一个选项Type=forking::

当父进程退出时,服务管理器将认为该单元已启动。

即使我没有在脚本中分叉任何进程。我在这里说得对吗?这是否能保证(除了错误等)我的脚本将在服务启动之前完成Before=?

例如其他类型:Type=exec:

“而在服务进程中的 fork() 和 execve() 都成功之前,exec 将不会继续。”

我不清楚proceed这里的意思,同时阅读man execve我也不明白 systemd 如何知道是否execve成功:

execve() 成功后不返回,并且根据新加载程序的内容覆盖调用进程的文本、初始化数据、未初始化数据(bss)和堆栈。

据我所知,其他类型(notify、dbus)man在进程启动时需要特殊功能。

systemd
  • 1 1 个回答
  • 33 Views

1 个回答

  • Voted
  1. Best Answer
    FelixJN
    2023-10-10T22:18:22+08:002023-10-10T22:18:22+08:00

    我认为你可以很好地type=oneshot使用RemainAfterExit=true; 从文档中

    oneshot 的行为与 simple 类似;但是,服务管理器会在主进程退出后考虑该单元。然后它将启动后续单位。RemainAfterExit=对于此类服务特别有用。如果既没有指定也没有指定Type=oneshot,则为隐含的默认值。请注意,如果在没有服务的情况下使用此选项,则服务将永远不会进入“活动”单元状态,而是直接从“激活”转换到“停用”或“死亡”,因为没有配置应连续运行的进程。特别是,这意味着在这种类型的服务运行(并且尚未设置)之后,它将不会显示为随后启动,而是显示为死亡。Type=ExecStart=RemainAfterExit=RemainAfterExit=

    可能不太清楚主要流程是什么,但是看一下解释ExecStart=就会发现:

    除非Type=forking设置,否则通过此命令行启动的进程将被视为守护进程的主进程。


    编辑

    请注意,这Type=oneshot是唯一允许多个ExecStart=选项的类型。它们按照出现的顺序依次执行,并且每个进程在运行时都是各自的主进程。

    再次查看手册:

    执行开始=

    启动此服务时执行的命令。根据下面“命令行”部分中描述的规则,该值被分成零个或多个命令行。

    除非 Type= 是一次性的,否则必须给出一个命令。当使用Type=oneshot时,可以指定零个或多个命令。可以通过在同一指令中提供多个命令行来指定命令,或者可以多次指定该指令以达到相同的效果。如果将此选项指定为空字符串,则要重置的命令列表将被重置,此选项之前的指定将无效。如果未指定 ExecStart=,则服务必须设置 RemainAfterExit=yes 和至少一个 ExecStop= 行。(缺少 ExecStart= 和 ExecStop= 的服务无效。)

    如果指定了多个命令,则按照命令在单元文件中出现的顺序依次调用这些命令。如果其中一个命令失败(并且不带“-”前缀),则其他行不执行,并且该单元被视为失败。

    • 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