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 / 问题 / 777166
Accepted
user149408
user149408
Asked: 2024-05-26 18:54:13 +0800 CST2024-05-26 18:54:13 +0800 CST 2024-05-26 18:54:13 +0800 CST

软件包安装过程中禁止计划作业

  • 772

在基于 Debian 的系统上,我有一个每 30 分钟运行一次的计划作业(例如 cron 作业或 systemd 计时器/服务)。但是,我不希望在安装或更新软件包的同时发生这种情况。

软件包安装可以手动或按计划进行,但在后一种情况下,会出现相当大的随机延迟。我可以调整我的工作时间表,以免干扰潜在的软件包更新(无论是否实际安装了某些内容),并记住在手动安装软件包时禁用该作业,并记住在之后启用它 - 但这并不令人满意。

因此,我正在寻找一种可靠的方法来告诉软件包安装正在进行中,以便我的工作可以检查它并退出(或延迟执行)(如果是这种情况)。如果在我的工作的同时在后台更新存储库信息或下载软件包,这并不是真正的问题,但我的工作不应在安装时运行(复制文件、配置、安装前/安装后脚本和相似的)。

在 OPNsense(基于 FreeBSD)上,系统更新程序获取特定文件的锁定,因此我将我的工作封装在flock.如果正在进行更新,我的工作将被跳过。如果在我的作业运行时触发升级,升级可能会失败,并显示一条消息,指示另一个更新正在进行中。

我想知道 Debian 上的 apt 是否有类似的东西,例如我可以检查的锁定文件。如果是这样,该机制是特定包管理前端独有的,还是可以与 .deb 包的所有标准工具(例如 dpkg、apt、aptitude、synaptic 等)一起使用?

我看到当 Synaptic 打开并尝试运行时sudo apt-get upgrade,我得到:

E: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 1234 (synaptic)
N: Be aware that removing the lock file is not a solution and may break your system.
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

然而,即使 Synaptic 正在运行(尽管当前没有安装任何东西),sudo flock -n /var/lib/dpkg/lock-frontend sleep 10 || echo File is locked也会成功(即flock返回true,表明我已经获得了锁,而没有获得锁sleep则执行)。echo与 相同的行为/var/lib/dpkg/lock。

那么如何才能获得“包安装锁定”呢?

debian
  • 1 1 个回答
  • 31 Views

1 个回答

  • Voted
  1. Best Answer
    user149408
    2024-05-30T23:52:04+08:002024-05-30T23:52:04+08:00

    Debian 上的包管理器 – 从我的测试结果来看,这对于apt前端来说也是如此dpkg– 锁定两个文件,/var/lib/dpkg/lock以及/var/lib/dpkg/lock-frontend.根据我的测试,一旦 GUI 出现,Synaptic 就会锁定这两个文件,并保留它们直到它退出。

    然而,Linux上有不同种类的锁,并且不能保证彼此兼容,因此两种方法可能会同时获取同一个文件的排他锁:

    • flock(1),内部调用flock(2),以及
    • lockf(3)fcntl(2),内部调用

    正如这个答案中详细介绍的,dpkg使用并且一直fcntl(2)在内部使用。不幸的是,虽然flock(2)大多数 Debian 系统都提供了一个命令行包装器,但我还没有找到fcntl(2).您的选择是安装chiark-utils-bin(它会为您提供with-lock-ex(1))或编写一些 Python 代码。以下内容对我有用,在 Synaptic 运行时报告文件已锁定,但在没有 apt 工具运行时报告成功:

    fname = '/var/lib/dpkg/lock'
    
    try:
        f = open(fname, 'w')
        fcntl.lockf(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
        print('Successfully locked {}'.format(fname))
        input('Press Enter to continue...')
    except IOError as e:
        # e.errno == errno.EAGAIN indicates the file is locked,
        # everything else indicates another error (e.g. permission denied)
        print('Unable to lock {}: {}'.format(fname, os.strerror(e.errno)))
    

    经过测试,我可以确认这会阻止相关 Python 程序和包管理器的并发执行——无论谁先尝试获取锁,其他进程都必须稍后重试。 Software Updater 显示Waiting for python3 to finishPython 程序是否持有锁;如果 Synaptic 正在运行或更新管理器正在安装更新,Python 程序将显示错误消息。

    不需要显式释放锁——当持有锁的进程退出时,这会自动发生。

    • 0

相关问题

  • GRUB 配置以识别同一 Linux 发行版的不同桌面环境(安装)

  • astyle 不会更改源文件格式

  • 接收有关全新 Debian 的电子邮件

  • Debian Stretch:libgs_plugin_systemd-updates.so 中的 gnome-software 段错误

  • 如何在拼音输入法中输入ü?

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