Systemd

Смена пользователя, от имени которого юнит Systemd запускает процесс

Быва­ет так, что воз­ни­ка­ет необ­хо­ди­мость поме­нять поль­зо­ва­те­ля, от име­ни кото­ро­го Systemd запус­ка­ет про­цесс. Напри­мер, если уста­но­вить TorrServer в Arch Linux, то по умол­ча­нию про­цесс TorrServer запус­ка­ет­ся от име­ни поль­зо­ва­те­ля root, что неже­ла­тель­но и даже опас­но. В этой неболь­шой замет­ке будет идти речь о том, как поме­нять в юни­те Systemd поль­зо­ва­те­ля, от име­ни кото­ро­го запус­ка­ет­ся про­цесс.

Итак, что­бы сме­нить поль­зо­ва­те­ля в юни­те Systemd, нам нуж­но его (юнит) отре­дак­ти­ро­вать. Для при­ме­ра, будем редак­ти­ро­вать юнит TorrServer. Откры­ва­ем юнит для редак­ти­ро­ва­ния:

sudo systemctl edit torrserver.service

Видим сле­ду­ю­щее содер­жи­мое:

### Editing /etc/systemd/system/torrserver.service.d/override.conf
### Anything between here and the comment below will become the contents of the drop-in file


### Edits below this comment will be discarded


### /usr/lib/systemd/system/torrserver.service
# [Unit]
# Description = TorrServer
# After = syslog.target network.target nss-lookup.target
#
# [Service]
# Type = simple
# Environment="GODEBUG=madvdontneed=1"
# ExecStart = /usr/bin/torrserver -d /var/lib/torrserver
# ExecReload = /bin/kill -HUP ${MAINPID}
# ExecStop = /bin/kill -INT ${MAINPID}
# TimeoutSec = 30
# Restart = on-failure
# LimitNOFILE = 4096
#
# [Install]
# WantedBy = multi-user.target

Как вид­но, в ниж­ней части в заком­мен­ти­ро­ван­ном виде нахо­дит­ся ори­ги­наль­ное содер­жи­мое фай­ла юни­та. Фра­за «Edits below this comment will be discarded» гово­рит нам о том, что все прав­ки, кото­рые будут осу­ществ­ле­ны после этой строч­ки будут откло­не­ны. Чтож, будем вно­сить прав­ки до неё.

Что­бы сме­нить поль­зо­ва­те­ля, от име­ни кото­ро­го юнит Systemd будет запус­кать про­цесс, в сек­цию [Service] нуж­но доба­вить стро­ку User= с име­нем поль­зо­ва­те­ля, от кото­ро­го будет запус­кать­ся про­цесс юни­том. Добав­ля­ем стро­ки в юнит не забы­вая о том, что раз­ме­стить их нуж­но выше той строч­ки. Теперь файл выгля­дит так:

### Editing /etc/systemd/system/torrserver.service.d/override.conf
### Anything between here and the comment below will become the contents of the drop-in file

[Service]
User=imatvey

### Edits below this comment will be discarded


### /usr/lib/systemd/system/torrserver.service
# [Unit]
# Description = TorrServer
# After = syslog.target network.target nss-lookup.target
#
# [Service]
# Type = simple
# Environment="GODEBUG=madvdontneed=1"
# ExecStart = /usr/bin/torrserver -d /var/lib/torrserver
# ExecReload = /bin/kill -HUP ${MAINPID}
# ExecStop = /bin/kill -INT ${MAINPID}
# TimeoutSec = 30
# Restart = on-failure
# LimitNOFILE = 4096
#
# [Install]
# WantedBy = multi-user.target

Сохра­ня­ем изме­не­ния в фай­ле юни­та и пере­за­пус­ка­ем сер­вис:

sudo systemctl restart torrserver.service

Гото­во. Теперь про­цесс, запу­щен­ный сер­ви­сом, юнит кото­ро­го мы отре­дак­ти­ро­ва­ли, будет запус­кать­ся от ука­зан­но­го нами поль­зо­ва­те­ля.