如何在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:
- 创建服务配置文件
~/.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))) ; 仅启动一次,不需要自动重启
- 手动加载并启动服务测试:
herd load ~/.config/guix/services/my-reboot-service.scm my-reboot-service - 设置开机自动启动:创建或编辑
~/.config/guix/shepherd/init.scm,添加以下内容:
(load "~/.config/guix/services/my-reboot-service.scm") (start my-reboot-service)
这样每次用户会话启动或系统开机后,Shepherd会自动执行你的命令。
内容的提问来源于stack exchange,提问作者user21429471
相关产品推荐
相关产品推荐

