LINUX.ORG.RU

Cлужба systemd для работы с nvidia-settings

 , , ,


1

2

Добрый день.

Есть скрипт /usr/local/bin/gpuoc.sh

#!/bin/sh
nvidia-settings -a «[gpu:0]/GPUGraphicsClockOffset[3]=200»

есть служба

[Unit]
Description=«gpu»
After=multi-user.target
[Service]
Type=simple
User=myuser
ExecStart=/usr/local/bin/gpuoc.sh
[Install]
WantedBy=multi-user.target"

Запихиваю службу в /home/myuser/.config/systemd/user, стартую ее systemctl --user start gpuoc и меняется частота видеочипа.
Но если положить службу в /etc/systemd/system, и сказать systemctl start gpuoc то получаю ошибку:

× gpuoc.service - «gpu»
Loaded: loaded (/etc/systemd/system/gpuoc.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Tue 2021-12-14 01:20:57 MSK; 7s ago
Process: 4723 ExecStart=/home/rsnorlax/.config/gpuoc.sh (code=exited, status=1/FAILURE)
Main PID: 4723 (code=exited, status=1/FAILURE)
CPU: 15ms
дек 14 01:20:57 SN-DT systemd[1]: Started «gpu».
дек 14 01:20:57 SN-DT gpuoc.sh[4724]: ERROR: The control display is undefined; please run nvidia-settings –help for usage information.
дек 14 01:20:57 SN-DT systemd[1]: gpuoc.service: Main process exited, code=exited, status=1/FAILURE
дек 14 01:20:57 SN-DT systemd[1]: gpuoc.service: Failed with result ‘exit-code’.

Судя по тому что по этому же принципу не работатет софтина nvfancontrol запущенная службой из /ets/systemd/system, подозреваю, что они пытаются запуститься от рута, но что-то идет не так. Помогите разобраться.



Последнее исправление: rsnorlax (всего исправлений: 1)

служба, выполняющая одну команду после запуска?

xmikex ★★★★
()

ERROR: The control display is undefined; please run nvidia-settings –help for usage information.

Очевидно нужно передать параметром дисплей, на который выставляются настройки. Под юзером он в переменных окружения.

goingUp ★★★★★
()
Ответ на: комментарий от goingUp

Не подскажете как это сделать? Или лучше подскажите почему у меня скрипт systemd не запускает от конкретного юзера, хотя он указан.

rsnorlax
() автор топика
Ответ на: комментарий от rsnorlax

По идее параметр -с

Посмотреть, какой у вас дисплей можно командой echo $DISPLAY

почему у меня скрипт systemd не запускает от конкретного юзера, хотя он указан

А как вы проверяли, что запускается не от того юзера?

goingUp ★★★★★
()
Последнее исправление: goingUp (всего исправлений: 1)
Ответ на: комментарий от goingUp

А как вы проверяли, что запускается не от того юзера?

Никак, кроме того что рассудил, что если служба нормально запускает скрипт по systemctl –user, но не запускает от просто systemctl и требует на запуск рутовый пароль.

rsnorlax
() автор топика
Ответ на: комментарий от ZenitharChampion

У тебя есть файл /etc/X11/xinit/xinitrc.d/95-nvidia-settings?

Только это ls /etc/X11/xinit/xinitrc.d/ 40-libcanberra-gtk-module.sh 50-systemd-user.sh 80xapp-gtk3-module.sh

rsnorlax
() автор топика
Ответ на: комментарий от goingUp

По идее параметр -с

Посмотреть, какой у вас дисплей можно командой echo $DISPLAY

Определил дисплей,добавил в скрипт переменную с номером дисплея. Теперь ругается, что не знает таких переменных, хотя из под юзера руками этот скрипт запускается и работает.

rsnorlax
() автор топика
Ответ на: комментарий от rsnorlax

Теперь ругается, что не знает таких переменных

$DISPLAY это переменная окружения, которая устанавливается, когда скрипт запускается из граф. среды. А если нет, то не устанавливается.

goingUp ★★★★★
()
Ответ на: комментарий от goingUp

$DISPLAY это переменная окружения, которая устанавливается, когда скрипт запускается из граф. среды. А если нет, то не устанавливается.

А что –user systemd запускает скрипт из графической среды? Приплыли, получается что вариантов нет?

rsnorlax
() автор топика
Ответ на: комментарий от rsnorlax

А что –user systemd запускает скрипт из графической среды?

Ну ты его руками запускаешь из графической среды? Значит да.

Только проблема в том что в systemd нет (на сколько я понял) чего-то типа "запустить юнит после того как будут загружены gui", так что мне пришлось вот такой костыль использовать:

юнит user-graphical-login.target

[Unit]
Description=User Graphical Login
Requires=default.target
After=default.targe

В нужных тебе юнитах, которые должны запускаться в "графике", пишешь

[Unit]
PartOf=user-graphical-login.target

<...>

[Install]
WantedBy=user-graphical-login.target

И потом скрипт для твоего DE\WM, который должен лежать где-то в "автостарте" и запускать этот таргет после запуска графического окружения, тем самым запуская нужные юниты:

#!/usr/bin/env bash

systemctl --user import-environment
systemctl --user start user-graphical-login.target

Все это выглядит как костыли, и может есть какое-то более вменяемое решение, но вот что могу предложить.

И, да, в моем случае это все в systemd --user (не знаю как там этот режим называется). Не совсем понимаю зачем тебе у рута это держать.

micronekodesu ★★★
()
Ответ на: комментарий от micronekodesu

костыли

у меня такие

[Unit]
Description="NVIDIA Dynamic fan control"

After=graphical.target multi-user.target
[Service]
Type=simple
Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/мойюзер/.Xauthority
Environment=XDG_CONFIG_HOME=/home/мойюзер/.config
Environment=XDG_VTNR=1
ExecStartPre=/bin/sleep 30
ExecStart=/usr/bin/nvfancontrol -l0 -f
Restart=always
RestartSec=30

[Install]
WantedBy=default.target

anonymous
()
Ответ на: комментарий от anonymous

After=graphical.target

У меня нет этой графической штуки для логина (и DE), у меня все заканчивается в multi-user.target и затем startx, по-этому (а может и не по этому) вариант с graphical.target у меня не взлетел и пришлось такое городить.

Ну и плюс "спасает" от ExecStartPre=/bin/sleep 30, так как этот скрипт в автозагрузке самым последним идет я знаю что все нужное точно загрузилось не упарываясь в systemctl list-dependencies, after\wanted\partof и прочее вот это все.

Чет я сейчас подумал что можно было вообще с systemd не заморачиваться и просто в "автозагрузку" скрипт с запуском нужного мусора положить.

micronekodesu ★★★
()
Последнее исправление: micronekodesu (всего исправлений: 3)
Ответ на: комментарий от anonymous

Да дело в том что такое крайне редко случается, а когда случается мне надо знать в чем причина падения и исправить чтоб не повторялось, по этому и в systemdшных этих моих юнитах рестарта нет.

Единственное, наверно, зависимости было бы сложнее разруливать, потому что у меня в этом таргете запускается несколько софтин, после которых запустятся другие софтины, и там и между ними определенная зависимость есть, так что на баше конечно я бы больше времени потратил чем на копипаст с минимальными изменениями файликов для systemd.

micronekodesu ★★★
()
Последнее исправление: micronekodesu (всего исправлений: 1)
Ответ на: комментарий от micronekodesu

в systemd нет (на сколько я понял) чего-то типа «запустить юнит после того как будут загружены gui»

кто тебе сказал этот бред и зачем ты гордо его несёшь в массы?

novitchok ★★★★★
()
Ответ на: комментарий от rsnorlax

У меня есть этот файл. И там прописан nvidia-settings с параметром --load-config-only. Этот файл у меня создался по умолчанию в Gentoo. Может ты создашь этот файл, и пропишешь туда своё параметр?

ZenitharChampion ★★★★★
()
Последнее исправление: ZenitharChampion (всего исправлений: 1)
Ответ на: комментарий от micronekodesu

Чет я сейчас подумал что можно было вообще с systemd не заморачиваться и просто в «автозагрузку» скрипт с запуском нужного мусора положить.

This. .config/autostart для того и придуман — нет, не хочу, хочу жрать говносистемду.

anonymous
()
Ответ на: комментарий от anonymous

Кстати да.

Вот таким способом я добавлял Compton (или compiz-manager) в автозагрузку в KDE3:

cat ~/.kde/Autostart/compton.desktop

[Desktop Entry]
Encoding=UTF-8
Exec=compton --vsync opengl
GenericName[en_US]=
StartupNotify=false
Terminal=false
TerminalOptions=
Type=Application
X-KDE-autostart-after=kdesktop

А вот так я добавлял команду nvidia-settings --load-config-only в GNOME 2. Зачем это было нужно? Во времена Ubuntu 8.10 и драйвера NVIDIA 173.xx, были «синие люди» при просмотре видео в Totem (ещё до флеша, как ни странно). Я думал, что у меня что-то с настройками гаммы, и пошёл в nvidia-settings разбираться. Но стоило только запустить утилиту, как видео чинилось в то же мгновение! И кстати, в современных дистрибутивах Linux я вижу эту команду в автозагрузке, скрипт запуска которой добавлен в DEB-пакет.

cat ~/.config/autostart/nvidia-settings.desktop

[Desktop Entry]
Type=Application
Exec=/usr/bin/nvidia-settings --load-config-only
Hidden=false
X-GNOME-Autostart-enabled=true
Name[ru_RU]=nvidia settings load
Name=nvidia settings load
Comment[ru_RU]=
Comment=

Кстати, вот эта команда X-KDE-autostart-after=kdesktop весьма интересная. Я её только сейчас увидел. Надо бы попробовать ей воспользоватьсяю

Дело в том, что у меня иногда Компиз стартует раньше, чем nvidia-settings --load-config-only. И из-за этого компиз не так плавно работает. Приходится выключать компиз, запускать nvidia-settings, выключать, и снова запускать Компиз

ZenitharChampion ★★★★★
()
Ответ на: комментарий от anonymous

Системдя, это не просто автостарт. А автостарт при нужных условиях, и контроль работы чтоб если не запустится или упадет перезапускалось и другие плюшки для которых надо было бы городить простыни скриптов. Для простого запуска она и не нужна, а нужна для програм работающих как демон или сервис. И конечно надо Ман почитать прежде чем использовать, а то так и будешь тупым хейтером неосилятором

anonymous
()
Ответ на: комментарий от ZenitharChampion

Что у вас нвидия сеттинг настраивает? Большинство параметров можно на постоянку прописать в конфиг иксов.

anonymous
()
Ответ на: комментарий от micronekodesu

Ну ты его руками запускаешь из графической среды? Значит да.

Ну а еще я сказал systemctl --user enable gpuoc и после рестарта сервис обрабатывает скрипт сам. без меня, мам, пап и кредитов))

Не совсем понимаю зачем тебе у рута это держать.

Ибо это это является для меня частью изучения линукса и системд в частности.

rsnorlax
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.