systemd 的 ExecStartPre 中的“!”是什么意思?

systemd 的 ExecStartPre 中的“!”是什么意思?

!调用历史扩展,!!重新执行之前的命令。

cat  /lib/systemd/system/motion.service
ExecStartPre=!/bin/mkdir -p /var/log/motion

同样的逻辑,!/bin/mkdir -p /var/log/motion意味着重新执行/bin/mkdir -p /var/log/motion,没有意义。
写成怎么样ExecStartPre=/bin/mkdir -p /var/log/motion
是什么!意思!/bin/mkdir

答案1

它可以防止同一定义中的任何User=,Group=和设置影响该命令。SupplementaryGroups=*.servicemkdir

显然,服务文件旨在motion以非 root 用户身份启动实际服务进程(我猜)。但由于该/var/log目录通常只能由 root 用户写入,因此服务文件首先mkdir -p /var/log/motion以 root 身份运行(然后可能将其分配给运行服务的用户?),以创建服务的日志目录(如果尚不存在)。

所以我希望在服务文件中出现这样的模式:

[Service]
User=motion
ExecStartPre=!/bin/mkdir -p /var/log/motion      # but this runs as root
ExecStartPre=!/bin/chown motion /var/log/motion  # also this
ExecStart=/usr/bin/motion                   # only this runs as "motion"

相关内容