!调用历史扩展,!!重新执行之前的命令。
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=
*.service
mkdir
显然,服务文件旨在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"