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 / 问题 / 780878
Accepted
Marcus Müller
Marcus Müller
Asked: 2024-07-27 02:14:41 +0800 CST2024-07-27 02:14:41 +0800 CST 2024-07-27 02:14:41 +0800 CST

关机时运行一次更新 – systemd-run?

  • 772

我有一些东西不想在图形会话运行时更新,但很乐意在关机时(图形会话结束后,网络仍然开启时)更新它们一次。所以,我不想编写服务文件,启用它,然后在每次关机时运行它。

现在,我想,好吧,systemd-run来救援吧:

systemd-run \
           --property=Type=oneshot \
           --property=DefaultDependencies=no \
           --property=Requires=network.service \
           --property=WantedBy=shutdown.target \
           /usr/bin/dnf5 update -y package1 packge2…

但这失败了

Failed to start transient service unit: Dependency type WantedBy may not be created transiently.

还有其他方法吗?

shutdown
  • 3 3 个回答
  • 123 Views

3 个回答

  • Voted
  1. Best Answer
    kos
    2024-08-10T05:44:33+08:002024-08-10T05:44:33+08:00

    此命令基于我在 Ask Ubuntu 上回答的问题的推断和改编,我将其转换为命令systemd-run。推断和改编的答案有助于理解命令背后的原因,并有助于将其设置为永久服务而不是临时单元,如下所示。

    请注意,这将在关机时运行,而不会在重启时运行。这是故意的。如果您不希望这样,并且希望在关机和重启时都运行它,只需将属性替换ExecStop为dnf5 update -y package1。

    systemd-run \
        --property="ExecStop=sh -c 'systemctl list-jobs | grep -q \"poweroff.target.*start\" && dnf5 update -y package1'" \
        --property=RemainAfterExit=true \
        --property=TimeoutStopSec=infinity \
        --property=After=network-online.target \
        true
    

    package1根据需要进行更换。


    我的研究告诉我:

    1. 如果您按照“关机/重启链中服务关闭的顺序”来解决问题,那么很难将服务锁定到关机/重启链中的正确位置;需要跟踪的内容实在太多了。这里的诀窍是按照“启动链中服务启动的顺序”来解决问题,并在服务启动oneshot后立即锁定服务network-online.target,同时将其标记为活动使用RemainAfterExit=true,并为其提供一个ExecStop操作,该操作将在系统关闭时(就在网络关闭之前)“自然”触发。
    2. 目前没有非常干净的方法来确定系统是否因关机或重启而关闭;但是,可以通过检查在关机/重启序列期间哪些 systemd 特殊目标处于活动状态来可靠地完成此操作;在这种情况下,poweroff.target仅在系统因关机而关闭时才会处于活动状态。

    因此,将所有内容放在一起,可以通过创建一个服务来完成/etc/systemd/system/update.service(当然,文件的名称和Description和ExecStop字段可以调整;确保该文件归所有root:root并具有644/-rw-r--r--权限):

    [Install]
    WantedBy=multi-user.target
    
    [Service]
    ExecStop=sh -c 'systemctl list-jobs | grep -q "poweroff.target.*start" && dnf5 update -y package1'
    RemainAfterExit=true
    TimeoutStopSec=infinity
    
    [Unit]
    After=network-online.target
    Description=update
    

    完成后,运行sudo systemctl enable --now update.service以启用该服务。

    TimeoutStopSec=infinity在更新的情况下显然是需要的,但如果您想将其用于其他用途,可以进行更改。

    • 3
  2. Marcus Müller
    2024-08-09T19:02:06+08:002024-08-09T19:02:06+08:00

    我已经要求@TomYan 将他们的评论转换为答案;遗憾的是,他们没有这样做,所以我的赏金将付之东流。无论如何:

    这里的方法是利用单元可以具有在退出时执行的命令这一事实;因此,具有

    • Type=oneshot
    • 一个虚拟的ExecStart(如 /usr/bin/true)(如果通过单元文件指定,则根本没有)
    • RemainAfterExit=true(即使虚拟对象已经退出,也将其标记为仍然有效)
    • ExecStop=运行我需要的命令
    • After=network.target确保该单元在网络停止之前停止(它指定它应该在之后启动,但在之前停止)

    应该可以工作,并且如果启动一次就会在关机时停止。

    我注意到停止超时可能是一个问题,但它不再是一个那么严重的问题,因为从 systemd 188 开始,可以TimeoutStopSec=为服务进行配置。

    • 1
  3. markgraf
    2024-08-03T22:09:03+08:002024-08-03T22:09:03+08:00

    对于仅一次更新,请尝试 at-job。

    否则:

    对于 Debian 之类的系统,安装和配置unattended-upgrades是必经之路。它提供了关机时安装的选项。

    Redhat 的对应版本是dnf-automatic。

    两者都使用 systemd-timer。

    如果您不想更新特定的包,您可以固定/保留它们。

    • -1

相关问题

  • 为什么 systemctl halt 要求输入密码但 systemctl reboot 和 systemctl poweroff 没有?

  • 3 关于必须进行硬关机和重启的问题

  • 如何使用 polkit 0.106 发送通知?

  • 系统在关机/重启时挂起 - 停止 UID 1000 的用户管理器

  • 了解 inittab 中的关闭命令

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