我想执行一个类似于“启动应用程序”的脚本,因为正式记录, 和在这个很好的答案中解释和在这个问题中再次被问到。
但是我还有其他非常具体的要求
- 不应允许受限用户更改对脚本的调用
- 该脚本应在会话登录后运行(最好在该用户的上下文中),并且刚刚登录的用户名必须对脚本可用
- 如果用户发生变化,脚本也应该运行(Ubuntu 允许更改用户而无需退出第一个用户)
这将呈现 upstart(据我所知,它在系统启动时运行)和标准启动应用程序,因为即使受限用户也可以管理它们。
答案1
我认为您正在寻找的是用户的 systemd。
您可以在用户目录中添加 .service 文件:
~ve/.config/systemd/user/default.target.wants/
调用该文件<something>.service
。
# Documentation available at:
# https://www.freedesktop.org/software/systemd/man/systemd.service.html
[Unit]
Description=This User Service
After=foo.service
[Service]
Type=simple
WorkingDirectory=~
Environment="DISPLAY=:0"
ExecStart=/usr/bin/script
ExecStop=/bin/kill "$MAINPID"
Restart=on-failure
RestartSec=5
[Install]
WantedBy=default.target
显然,您需要调整参数以满足您的需求。这将ExecStart=...
使用您需要的任何脚本或二进制文件启动定义的进程。该进程在用户登录时启动。X11 将运行。GDM 可能未 100% 启动。但是,您可以开始打开窗口,并且它会按预期工作。
ExecStop=...
如果您在用户之间切换,该过程将继续运行。当用户注销时,它将停止。
如果您想运行一次脚本,您需要更改类型Type=once
并删除Restart=...
变量。
如果您正在创建 Debian 包,您实际上想要将该<something>.service
文件安装在以下位置:
/usr/lib/systemd/user/...
然后您需要为该用户启用该服务。
干净的方法是使用该systemctl
工具设置守护进程,如下所示:
systemctl --user deamon-reload
systemctl --user unmask '<something>.service'
systemctl --user enable '<something>.service'
然而,这只有当用户自己可以运行所述命令时才有效。
你的软件包必须安装它手动否则。以 root 身份运行时,以下内容有效:
mkdir -p /home/${USER}/.config/systemd/user/default.target.wants
chown -R ${USER}:${USER} /home/${USER}/.config/systemd
rm -f /home/${USER}/.config/systemd/user/default.target.wants/<something>.service
sudo -H -u ${USER} sh -c "ln -s /usr/lib/systemd/user/<something>.service /home/${USER}/.config/systemd/user/default.target.wants/<something>.service"
最后一行sudo
是以用户身份创建软链接${USER}
。