在 systemd 用户服务中设置 niceness 值

在 systemd 用户服务中设置 niceness 值

我想以非 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将以mycommandroot 身份执行,我们将 添加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

相关内容