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
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1545627
Accepted
Jason C
Jason C
Asked: 2025-04-13 05:42:24 +0800 CST2025-04-13 05:42:24 +0800 CST 2025-04-13 05:42:24 +0800 CST

仅在下次重启时运行一次程序

  • 772

Ubuntu 22.04

我创建了一个 Debian 包,它必须在用户重新启动机器后执行一些安装后的工作。

我有一个执行重启后工作的脚本,让它在下次重启后运行一次的正确方法是什么?

我目前的想法是将其注册为运行一次的 systemd 服务,并让它在运行后接触一些虚拟文件,然后如果虚拟文件存在(例如在随后的重启后)就不执行任何操作。

但我想知道是否已经有其他内置方法可以在下次重启后仅运行一次程序。

boot
  • 2 2 个回答
  • 1229 Views

2 个回答

  • Voted
  1. Best Answer
    muru
    2025-04-14T01:19:39+08:002025-04-14T01:19:39+08:00

    我目前的想法是将其注册为运行一次的 systemd 服务,并让它在运行后接触一些虚拟文件,然后如果虚拟文件存在(例如在随后的重启后)就不执行任何操作。

    作为用户,我更希望你这样做,而不是使用一些神奇的自动删除脚本之类的东西,因为事后很难追踪。我认为这种方法有几个好处:

    1. systemd 内置了对多种情况的支持,例如:

      ConditionPathExists=

      检查文件是否存在。如果指定的绝对路径名不存在,则条件失败。如果传入的绝对路径名ConditionPathExists=以感叹号 (" !") 为前缀,则测试为否定,并且仅当路径不存在时才会启动该单元。

      在版本 244 中添加。

      还有其他的ConditionPathExistsGlob,例如ConditionDirectoryNotEmpty,,,ConditionFileNotEmpty等等。

      如果您希望将脚本更改为在每次启动时运行,则只需删除该条件。

    2. 假设此服务和条件已记录在案,则用户可以在需要时通过确保条件不满足轻松地重新运行脚本。

    3. 检查配置脚本的状态更加容易。

    4. 用户可以更轻松地阻止脚本运行(通过在安装前屏蔽服务),以便他们可以在他们选择的重新启动时运行脚本(通过在他们想要时取消屏蔽)。

    • 14
  2. Leppie
    2025-04-13T06:59:21+08:002025-04-13T06:59:21+08:00

    Crontab 专门用于在设定的时间运行命令、脚本或应用程序。使用 crontab 不需要提升权限,除非修改了系统文件和/或设置。

    Cron 还方便地附带内置选项“@reboot”:

    @reboot [/path/to/script]
    

    作为安装脚本的一部分,可以使用以下结构来添加 crontab 条目:

    (crontab -l 2>/dev/null; echo "@reboot /opt/script_to_run.sh") | crontab -
    

    使用 -l(列表)选项检查条目是否正确:

    leppie@aud2404:~$ crontab -l
    @reboot /opt/script_to_run.sh
    @reboot /opt/some_other_script.sh
    

    以类似的方式,要删除 crontab 条目,可以使用 sed 删除所需的条目:

    leppie@aud2404:~$ crontab -l | sed '\|/opt/script_to_run.sh|d' | crontab -
    leppie@aud2404:~$ crontab -l
    @reboot /opt/some_other_script.sh
    

    然后在脚本中添加一个部分,以便在完成所有需要做的事情后删除 crontab 条目。

    Cron 并非某个在后台执行神奇操作的“晦涩”程序。它只是一个用户级任务调度程序。此外,最佳实践是使用脚本记录其执行的操作(以及何时执行)。因此,将 cron 与编写良好的脚本结合使用,绝不会给用户带来任何疑惑。在服务器领域,cron 的使用非常广泛。

    • 5

相关问题

  • grub 菜单中的“恢复”选项是什么?

  • 用户如何避免在启动时输入密码?[关闭]

  • 更改 Wubi 的启动顺序

  • 如何在 Ubuntu 启动时显示或隐藏启动消息?

  • 如何避免启动时出现“S to Skip”消息?

Sidebar

Stats

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

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve