我想以非 root 身份启动 xcape,并将 nice 值设置为 -20。但是,设置 nice 值 -20 需要 root 权限。所以我想知道这是否可行。我也尝试创建系统服务和设置User=myuser
,但 xcape 需要 xorg,DISPLAY
因此XAUTHORITY
我目前得到的:
[Unit]
Description=xcape: esc on caps lock
PartOf=graphical-session.target
[Service]
Type=simple
Nice=-20
ExecStart=/usr/bin/xcape -t 180 -e 'Caps_Lock=Escape'
[Install]
WantedBy=default.target
答案1
我最终想出了一个使用 sudo 1 的解决方法,因为据我所知,systemd 不支持开箱即用的功能。
1)向 sudoers 文件添加命令
首先将以下行添加到末尾/etc/sudoers
(替换myusername
为您的用户名,mycommand
执行的命令并根据需要调整优先级值):
myusername ALL=(root) NOPASSWD: /usr/bin/nice -n -20 sudo -u myusername mycommand
解释:
允许用户以 root 身份myusername
执行命令sudo /usr/bin/nice -n -20 sudo -u myusername mycommand
而无需输入密码。由于sudo nice -n -20 mycommand
将以mycommand
root 身份执行,我们将 添加sudo -u myusername
到命令前面,这样mycommand
将由 执行myusername
。这是遵守最小特权原则的安全措施。
2)在服务脚本中使用sudo执行命令
现在我们无需输入密码即可执行此特定命令:
[Service]
ExecStart=sudo /usr/bin/nice -n -20 sudo -u myusername mycommand
例如:xcape
/etc/sudoers
myusername ALL=(root) NOPASSWD: /usr/bin/nice -n -20 sudo -u myusername xcape -t 180 -e Caps_Lock=Escape
~/.config/systemd/用户/xcape.service
[Unit]
Description=xcape: esc on caps lock
PartOf=graphical-session.target
[Service]
Type=forking
ExecStart=sudo /usr/bin/nice -n -20 sudo -u myusername mycommand
[Install]
WantedBy=default.target
启动服务:systemdctl --user start xcape
1如果 sudo 不可用,还可以编写辅助可执行文件并使用 setuid 位。
答案2
[Unit]
Description=Colibri
After=uart.service
#After=network-online.target
#Requires=network-online.target
[Service]
Type=simple
Restart=always
RestartSec=60
#ExecStartPre=/bin/sleep 20
User=colibri
Nice=-10
StandardOutput=null
StandardError=null
SyslogIdentifier=Colibri
# LogLevelMax=warning
WorkingDirectory=/home/colibri/colibri/
ExecStart=/usr/bin/env python /home/colibri/colibri/main.py
TimeoutStopSec=10
#KillMode=process
[Install]
WantedBy=multi-user.target