You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Guix系统中实现程序开机自启动?

Guix系统实现开机自启命令的方案(替代@reboot)

mcron作为Guix默认的cron实现,不支持非标准的@reboot语法,直接在crontab里添加@reboot echo hello会触发报错:

%crontab -e
mcron: /tmp/crontab.2164:1: Bad job line in Vixie file.
Edit again?

下面提供两种普通用户可操作的替代方案:

方案一:用mcron的Guile API实现开机单次运行

mcron支持通过Guile脚本定义任务,我们可以借助标记文件判断系统是否刚启动,实现开机后仅执行一次命令:

  • 创建~/.config/mcron/my-reboot-jobs.scm脚本,内容如下:
;; 开机后仅执行一次的任务
(job (lambda (now)
       ;; 用/tmp下的标记文件判断是否首次运行,重启后/tmp文件会自动清除
       (let ((flag-file "/tmp/my-reboot-flag"))
         (if (not (file-exists? flag-file))
             (begin
               (call-with-output-file flag-file (lambda (port) #t))
               #t)
             #f)))
     (lambda ()
       ;; 替换成你需要执行的命令
       (system "echo hello > ~/.reboot-log")))
  • 执行命令加载这个任务:mcron ~/.config/mcron/my-reboot-jobs.scm

因为/tmp目录下的文件会在系统重启后自动删除,所以每次开机mcron都会重新触发任务,刚好满足需求。

方案二:用Guix用户级Shepherd服务(无需依赖mcron)

Guix自带的Shepherd init系统支持普通用户创建自定义服务,完全不需要依赖mcron:

  1. 创建服务配置文件~/.config/guix/services/my-reboot-service.scm:
(use-modules (gnu services)
             (gnu shepherd))

(define my-reboot-service
  (service
   (make <service>
     #:provides '(my-reboot-task)
     #:start (lambda ()
               ;; 这里写你要执行的开机命令
               (system "echo hello > ~/.reboot-log"))
     #:stop (lambda _ #t)
     #:respawn? #f))) ; 仅启动一次,不需要自动重启
  1. 手动加载并启动服务测试:herd load ~/.config/guix/services/my-reboot-service.scm my-reboot-service
  2. 设置开机自动启动:创建或编辑~/.config/guix/shepherd/init.scm,添加以下内容:
(load "~/.config/guix/services/my-reboot-service.scm")
(start my-reboot-service)

这样每次用户会话启动或系统开机后,Shepherd会自动执行你的命令。

内容的提问来源于stack exchange,提问作者user21429471

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 20:47:26