如何在Snap中禁用自动刷新

在Snap中是否可以禁用自动刷新?这个链接说Snaps会每天自动后台更新到最新版本。有些Snaps(如vlc)每天都会构建,但每天安装它们没有意义。

1sudo systemctl stop snapd.service sudo systemctl disable snapd.service 可能有效。Ubuntu 变成了 OS-X:“你想要如何更新?是 立即 还是 自动?” - Vasilii Suricov
https://snapcraft.io/docs/keeping-snaps-up-to-date - djvg
@djvg 请查看下面 beliaev-maksim 的回答。 - sebix
对于在网上找到这个问题的任何人,简而言之就是在第二个答案中,大约在一半的位置。它是 sudo snap refresh --hold=forever <软件包名称>。不需要关闭整个 snap 服务,也不要舍弃一切。 - undefined
1@VasiliiSuricov 最糟糕的是,开机后就会出现“请关闭X以升级”的通知。 - undefined
9个回答

根据您的具体需求,有几个选择。

更新导致我的应用程序出错了!

运行snap revert package-name回到该应用程序的上一个版本。您将保持在该版本上,直到下一个版本发布。如果下一个版本仍然有问题,您可以再次运行snap revert

我想使用旧版本的应用程序

许多在Snap Store中的软件使用tracks来进行主要软件发布。大多数Snaps默认使用latest/stable track,这将在应用程序发布后为您提供最新的更新,但用户可以选择不同的track以使用特定版本。

例如,对于CLion IDE,您可以通过运行snap info clion查看支持的tracks。您可以通过运行snap refresh clion --channel=2020.2/stable切换到不同的track。您将保持在该track上,直到手动更改为其他track。您仍将自动获取应用程序的更新,但根据您选择的track,您只会获得该软件特定版本的次要更新。

发行商决定是否在他们的快照中启用曲目,因此如果你喜欢的快照没有你所需版本的曲目,请务必联系出版商!

我希望在重要演示之后再发布所有更新

"保留"选项正是你需要的。你可以指定一个确切的日期,Snap会在那个日期之前保留任何更新。例如,这将保留未来30天的更新。

snap refresh --hold=<duration> <snap1> <snap2>
  • 如果您不指定快照,则将应用于整个系统
  • 如果您想无限期禁用更新,请使用--hold=forever

我不希望在工作日更新

在这种情况下,您可能想要更改刷新计时器。例如,以下选项将刷新计时器设置为每月最后一个星期六,从晚上23:00到第二天早上1:00。

sudo snap set system refresh.timer=sat5,23:00-01:00

你可以使用CLI工具或者Snap Store来查看可用的更新。

当我支付下载带宽时,我想要禁用更新

默认情况下,当NetworkManager检测到计量连接(如LTE/3G/4G)时,Snap不会进行更新。如果NetworkManager没有正确检测到,你可以手动设置

我想在应用程序运行时禁用更新。

这是一个实验性功能,你可以通过运行以下命令来启用:

snap set core experimental.refresh-app-awareness=true

更多信息,请参阅快照刷新感知和更新抑制

我想做其他事情!

有关更多选项,请参阅控制更新文档。


5我想在使用正在更新的程序时禁止自动更新。根据我的经验,应用程序在运行时进行更新通常会导致崩溃(例如Chrome)。 - w-sky
3好建议 @w-sky!您可以通过打开实验性的“刷新应用程序感知”选项来实现:https://snapcraft.io/blog/experimental-feature-snap-refresh-awareness-and-update-inhibition我已更新答案,包括此信息。 - Merlijn Sebrechts

在撰写本文时,官方尚不支持此功能,这引起了一场激烈的辩论。如何更好地控制桌面更新仍在讨论中

解决方案1

在你的/etc/hosts/文件中屏蔽商店:

127.0.0.1 api.snapcraft.io

对我来说有效的方法是sudo nano /etc/hosts,复制粘贴这一行,然后按下F2键,接着按Y键,最后按下回车键。
解决方案2:
如果网络连接被计量,请禁用自动更新功能。
首先,进入您的网络设置。

Network settings

然后,点击您两个网络接口右侧的齿轮图标,并勾选“限制后台数据使用” - 这将把连接标记为计量连接。

Restrict background data

最后,打开一个终端并输入(docs):

sudo snap set system refresh.metered=hold

2只有当NetworkManager检测到计量连接时,refresh.metered=hold才会起作用。 - codywohlers
1解决方案2将仅保留最多60天的更新。 - Merlijn Sebrechts

停止(将在启动时重新启动),然后禁用snapd守护程序。
sudo systemctl stop snapd.service
sudo systemctl mask snapd.service

注意(systemctl):mask是disable的更强版本。
重新启用和刷新:
sudo systemctl unmask snapd.service
sudo systemctl start  snapd.service
sudo snap refresh

刷新将刷新系统中的所有快照。

这是比任何给出的答案更好的总结。 由于某种原因,那个问题被标记为重复,指向了这个问题:)。


4这是唯一合理的答案。像快照这样以不可预测的方式改变系统,不仅令人恼火,而且具有破坏性,就像原子弹一样。真的。我宁愿被某个流氓原子弹击倒,也不愿意遭受像快照这样糟糕设计的东西!非常感谢!你的解决方案有效。 - Tino
3很遗憾,这个方法已经不再适用了,因为一些软件(例如Firefox)如果snapd没有运行,将拒绝启动。 - HubertNNN
确认已经停止工作了。应用程序无法启动。真讨厌! - Greendrake

使用最新版本的Snap(目前在Edge频道上),您可以禁用Snap更新。

新的保留功能允许系统管理员和终端用户停止或推迟Snap更新,时间长短由他们决定。保留可以应用于单个Snap或整个已安装的Snap集,可以在有限的时间内暂停Snap更新,或者如果需要,可以无限期地进行保留。

例如,要暂停VLC的Snap更新3天,您将运行以下命令:

snap refresh --hold=72h vlc

将于2022-11-17T12:04:59Z之前对"vlc"进行一般性更新。

同样地,为了暂停所有快照的刷新而持续48小时:

snap refresh --hold=48h

所有快照的自动刷新将持续到2022年11月16日12:27:25Z。

要完全停止自动刷新,且不使用计时器:

snap refresh --hold

自动刷新所有快照,持续时间无限。
来源:https://snapcraft.io/blog/hold-your-horses-i-mean-snaps-new-feature-lets-you-stop-snap-updates-for-as-long-as-you-need

在Ubuntu 22.04上无法正常工作,我收到了“错误:未知标志hold”。 - Daniel
@Daniel,你安装了Snap软件包的最新版本吗? - Beliaev Maksim
我没有使用Edge浏览器。这可能是问题所在,因为这个功能是在Snap 2.58中推出的,而我的版本是2.57(https://askubuntu.com/questions/1446618/in-snap-error-unknown-flag-hold)。 - Daniel
应该适用于Snap 2.58版本及以上:https://forum.snapcraft.io/t/disabling-automatic-refresh-for-snap-from-store/707/371可以确认在22.04上的2.59版本中正常工作。 - Tejas Kale

目前还无法这样做。不过,你可以使用以下命令来安排自动更新的时间:
sudo snap set core refresh.schedule=8:00-20:00

在这种情况下,更新只会在晚上8点到早上8点之间发生(一个例子)。

snap set core refresh.schedule=20-8 错误:无法执行以下任务: - 运行“core”快照的配置钩子(运行钩子“configure”:无法解析“20”:不是有效的时间) - sergiusens
那个最后一个成功了。 - sergiusens
是的,这个方法有效。我刚刚将我的设置为“18:00-20:00”,这个时间段正好不在我当前的时间范围内。在执行了当前刷新任务的“sudo snap abort 123”命令和系统重启后,我再也没有刷新任务了。 - icc97
1在2.31版本之前的snapd中,根据https://snapcraft.io/docs/keeping-snaps-up-to-date,将`refresh.timer`替换为`refresh.schedule`。 - codywohlers

刷新服务由systemd启动并在以下位置进行配置:
  • /lib/systemd/system/snapd.refresh.service
  • /lib/systemd/system/snapd.refresh.timer
如果你想禁用自动刷新,可以在/etc/systemd中覆盖这些配置。可能最简单的方法就是将定时器设置为你喜欢的频率。

一个解决方案可能是从特定版本的频道安装,例如对于 PyCharm:

snap install pycharm-professional --channel 2018.3/stable --classic

然后,除非发布2018.3的新补丁版本,否则快照将不会更新。
要查看可用的频道,请使用"snap info"命令,例如。
$ snap info pycharm-professional
name:      pycharm-professional
summary:   Python IDE for Professional Developers
publisher: jetbrains✓
contact:   https://www.jetbrains.com/pycharm/documentation/
license:   unset
description: |
  PyCharm Professional Edition is an IDE for professional Python development. It is designed by
  programmers, for programmers, to provide all the tools you need for productive Python, Web and
  Scientific development.
  
  PyCharm Professional Edition is available for a free 30-day evaluation.
  
  Monthly and yearly subscription options are available for companies and individual users. Find out
  more on https://www.jetbrains.com/pycharm/buy/
commands:
  - pycharm-professional
snap-id:      Uqpw0ZWqy6Wh4mgaWE0rxgM5tAGCwf4D
tracking:     stable
refresh-date: 10 days ago, at 09:22 PDT
channels:
  stable:           2019.1.1 2019-04-03 (127) 392MB classic
  candidate:        2019.1.1 2019-04-03 (127) 392MB classic
  beta:             2019.1.1 2019-04-03 (127) 392MB classic
  edge:             2019.1.1 2019-04-03 (127) 392MB classic
  2019.1/stable:    2019.1.1 2019-04-03 (127) 392MB classic
  2019.1/candidate: 2019.1.1 2019-04-03 (127) 392MB classic
  2019.1/beta:      2019.1.1 2019-04-03 (127) 392MB classic
  2019.1/edge:      2019.1.1 2019-04-03 (127) 392MB classic
  2018.3/stable:    2018.3.5 2019-02-27 (121) 355MB classic
  2018.3/candidate: 2018.3.5 2019-02-27 (121) 355MB classic
  2018.3/beta:      2018.3.5 2019-02-27 (121) 355MB classic
  2018.3/edge:      2018.3.5 2019-02-27 (121) 355MB classic
  2018.2/stable:    2018.2.8 2019-04-12 (128) 313MB classic
  2018.2/candidate: 2018.2.8 2019-04-12 (128) 313MB classic
  2018.2/beta:      2018.2.8 2019-04-12 (128) 313MB classic
  2018.2/edge:      2018.2.8 2019-04-12 (128) 313MB classic
  2018.1/stable:    2018.1.6 2018-11-15 (101) 314MB classic
  2018.1/candidate: 2018.1.6 2018-11-15 (101) 314MB classic
  2018.1/beta:      2018.1.6 2018-11-15 (101) 314MB classic
  2018.1/edge:      2018.1.6 2018-11-15 (101) 314MB classic
  2017.3/stable:    2017.3.7 2018-11-15 (100) 344MB classic
  2017.3/candidate: 2017.3.7 2018-11-15 (100) 344MB classic
  2017.3/beta:      2017.3.7 2018-11-15 (100) 344MB classic
  2017.3/edge:      2017.3.7 2018-11-15 (100) 344MB classic
installed:          2019.1.1            (127) 392MB classic


这是我对这个问题的解决方案(在2022年6月测试过Ubuntu 22.04)。以下假设您希望对安装更新的时间有控制权。也就是说,您希望查看要进行的更新并控制这些更新的时间,但不想阻止单个快照的更新。 自动刷新的快照配置 如其他答案中所述,快照允许控制自动更新的时间,但截至目前为止,无论其他参数如何,都有一个90天的最后期限。这些控制方式在文档的这一部分中描述(https://snapcraft.io/docs/keeping-snaps-up-to-date)。 初始解决方案 起初,我将保留日期设置为未来的90天,并调用“snap refresh --list”来确定哪些快照有可用的更新,然后使用“snap refresh”完成更新。最后,将保留日期重新设置为未来的90天。但是,这还不够,因为保存的有效保留日期是在上次刷新后的90天。 “last-refresh” 无论出于何种原因,snapd配置中的“last-refresh”参数仅在snapd执行自动刷新时更新,而不是手动启动的刷新。请注意:代码的原因是,如果您提供要刷新的快照列表,服务器将不会设置last-refresh,并且命令行客户端将完整刷新命令转换为包含所有活动(非保留)快照的服务器请求列表。
因此,要使此方案实际起作用,您需要以某种方式更新last-refresh。一种方法是更改“hold”和“timer”参数,以便进行自动刷新(但不需要手动更新任何内容),并在自动刷新后将它们设置回未来的90天。
手动更新“Last-refresh”
这种方法不够稳健,不是良好的实践,可能会受到开发团队的反对,但更容易控制。可以按照此测试文件(https://github.com/snapcore/snapd/blob/master/tests/lib/tools/snapd-state)中prevent_autorefresh函数中的详细说明手动更新它。 请注意:snapd在重新启动之前不会重新读取配置文件。
执行刷新的步骤(脚本文件格式)
#!/bin/sh
sudo snap refresh --list
read -p "Run snap refresh [Yes/no]?" refresh
case $refresh in
    [Nn]* ) break;;
    * )
        sudo snap refresh

        #Update the last-refresh time
        sudo systemctl stop snapd
        sudo jq -c ".data[\"last-refresh\"] = \"$(date +%Y-%m-%dT%H:%M:%S%:z)\"" /var/lib/snapd/state.json > /var/lib/snapd/state.json.new
        sudo chmod 600 /var/lib/snapd/state.json.new
        sudo mv /var/lib/snapd/state.json.new /var/lib/snapd/state.json
        sudo systemctl start snapd

        sudo snap set system refresh.hold="$(date --date='today+90days' --iso-8601=seconds)"
    ;;
esac

超过90天保留快照

根据我对代码的审查和迄今为止的测试,我相信通过定期更新最后刷新参数并重置保留日期,可以无限期地保留快照,而无需进行手动刷新。由于这不是我想要做的,所以我没有进行测试。


您可以设置一个本地的 Snap Store Proxy,以控制 Snap 客户端所看到的修订版本。