LINUX.ORG.RU

Выполнить команду при включении/выключении и засыпании/пробуждении системы

 


1

1

В какие места можно кинуть скрипт/команду, чтобы они исполнялись при выключении/включении и перед ждущим/спящим режимами и после выхода из них? Кидал в /etc/rc.local, /etc/default/hal, /etc/pm/sleep.d/ и /usr/lib/pm-utils/sleep.d - не работает. Выполнить нужно две команды

ddccontrol -r 0xe1 -w 0 dev:/dev/i2c-1
ddccontrol -r 0xe1 -w 1 dev:/dev/i2c-1
Может я что не так делаю. Kubuntu 16.04

★★

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

смотри в сторону systemd скриптов. Например перед гибернацией выполнить комманду можно примерно так

[Unit]
 Before=hibernate.target

[Service]
 Type=oneshot
 ExecStart=/что то выполнить
 RemainAfterExit=yes

[Install] 
WantedBy=hibernate.target
к сожалению еще сам не проверял. У меня работает перед выключением(shutdown.target) примерно тоже самое

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

Команду добавил в шапку. Куда её кинуть?

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

что за ddccontrol? в любом случае нужно помнить что в ExecStart= нужно прописывать полные пути. В твоем случае команду нужно запустить скорее всего через шелл. (пути у меня на федоре)

ExecStart=/usr/bin/sh -c «/путь/к/ddccontrol -bla»

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

- твои скрипты должны лежать в /etc/systemd/system. Посмотри какой нибудь в nano или с cat, чтобы увидеть как они устроенны.

в моем примере видишь 3 раздела. В разделе [Service] execstart выполняет твою команду. Тип oneshot я выбрал сам, вероятно наиболее подходящий. Многие команды выполняются корректно в таком стиле как я написал через sh, но пути всегда должны быть абсолютными. Поищи где находится твоя команда

$ whereis  ddccontrol

и забей сюда. Например в федоре путь с sh такой ExecStart= /usr/bin/sh -c «/путь/ddccontrol -r 0xe1 -w 1 dev:/dev/i2c-1»

- после написания скрипта сделать systemctl daemon-reload если хочешь его потестить сразу

- сделать systemctl enable твой_скрипт.service чтобы он проинсталлировался

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

KOT040188 xa, прикольная штука :))) Обалдеть, очень нужная вещь, я только что свой так выключил. Молодец, где откопал?

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

На просторах интернета. Причём очень давно. Но авторы забили на неё в 2006 году и её не было в источниках. В 16.04 внезапно добавили в источники. Кстати есть gddccontrol - использовать не советую - глючная до безобразия…

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

спасибо, действительно интересная вещь. А ты уверен что команда правильная? у меня выглядит так

/usr/bin/ddccontrol dev:/dev/i2c-1 -r 0xd6 -w 4
jtad
()
Ответ на: комментарий от jtad

не подкаталоги, у меня такой путь

/etc/systemd/system/monitor.service 

работающий скрипт у меня

[Unit]
 Before=shutdown.target

[Service]
 Type=oneshot
 ExecStart=/usr/bin/sh -c "/usr/bin/ddccontrol dev:/dev/i2c-1 -r 0xd6 -w 4"
 RemainAfterExit=yes

[Install]
WantedBy=shutdown.target

jtad
()
Ответ на: комментарий от jtad
kot@kot-MS-7930:/etc/systemd/system$ ls
bluetooth.target.wants                      hybrid-sleep.target.wants
dbus-org.bluez.service                      multi-user.target.wants
dbus-org.freedesktop.Avahi.service          network-online.target.wants
dbus-org.freedesktop.ModemManager1.service  ofono.service
dbus-org.freedesktop.nm-dispatcher.service  paths.target.wants
dbus-org.freedesktop.thermald.service       printer.target.wants
default.target.wants                        shutdown.target.wants
display-manager.service                     sockets.target.wants
display-manager.service.wants               suspend.target.wants
getty.target.wants                          sysinit.target.wants
graphical.target.wants                      syslog.service
hibernate.target.wants                      timers.target.wants
KOT040188 ★★
() автор топика
Ответ на: комментарий от KOT040188

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

Probing for available monitors
Detected monitors :
No monitor supporting DDC/CI available.
If your graphics card need it, please check all the required kernel modules are loaded (i2c-dev, and your framebuffer driver).
jtad
()

Короче нифига не понял куда класть…

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

У меня gddccontrol постоянно теряет монитор и при этом меняет настройки как захочет. Но ddccontrol работает чётко… Он не сырой, он брошеннный…

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

мой скрипт называется monitor.service и должен лежать по этому пути

/etc/systemd/system/monitor.service 
это пути для кастомных скриптов, которые мы сами создаем

ура, вопрос решился с ddccontrol. Надо подгружать в ядро модуль i2c и мониторы опять распознаются

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

А, понял. Так это для какого случая - загрузка выключение или спячка? А на бубунте не надо подгружать модули…

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

так там же тоже написано

Для того, чтобы не приходилось после каждого запуска системы запускать модули ручками, вносим изменения в /etc/modules, дописываем модули изменения до вида.

    lp
    rtc
    i2c-dev
    interlfb (тут будет ваш фреймбуфер)

посмотри точно у тебе после рестарта распознает монитор?

оказалось у меня shutdown.target не срабатывал, надо добавить 2 других. В твоем случае наверно еще hibernate.target и еще там что есть. У меня не активирована гибернация, потому действую вслепую

окончательный вид скрипта такой

Unit]
 Before=shutdown.target reboot.target halt.target

[Service]
 Type=oneshot
 ExecStart=/usr/bin/sh -c "/usr/bin/ddccontrol dev:/dev/i2c-1 -r 0xd6 -w 4"
 RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

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

Там написано

В Ubuntu 15.10 и старше лично мне не потребовалось, всё работает из коробки

посмотри точно у тебе после рестарта распознает монитор?

Не сомневайтесь.

окончательный вид скрипта такой

А для выхода из сна, спящего и включения системы какие слова писать? Усыпил - не сработало. Может перезагрузится надо?

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

а ты свой монитор в гибернацию отправляешь? Мой автоматически уходит, когда нет сигнала. После выключения безполезно что либо запускать. Наверно. Еще не пробовал

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

Гибернация это мигающая лампочка, а я выключаю монитор совсем. После выключения нужная команда включает монитор - проверено. Почему не работает скрипт? Я что-то упустил? Что-то я не узнаю linux…

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

«Усыпил - не сработало. Может перезагрузится надо?» запости твой сюда.

и еще вывод команды

systemctl list-units --type target --all
может твой таргет не hibernate, а другой. Выключать пробовал комп, должен по крайней мере вместе выключиться

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

[code-bash]kot@kot-MS-7930:~$ systemctl list-units --type target --all UNIT LOAD ACTIVE SUB DESCRIPTION basic.target loaded active active Basic System bluetooth.target loaded active active Bluetooth cryptsetup.target loaded active active Encrypted Volumes emergency.target loaded inactive dead Emergency Mode final.target loaded inactive dead Final Step getty.target loaded active active Login Prompts graphical.target loaded active active Graphical Interface halt.target loaded inactive dead Halt local-fs-pre.target loaded active active Local File Systems (Pre) local-fs.target loaded active active Local File Systems mail-transport-agent.target loaded active active Mail Transport Agent multi-user.target loaded active active Multi-User System network-online.target loaded active active Network is Online network-pre.target loaded inactive dead Network (Pre) network.target loaded active active Network nss-lookup.target loaded inactive dead Host and Network Name Lookups nss-user-lookup.target loaded active active User and Group Name Lookups paths.target loaded active active Paths reboot.target loaded inactive dead Reboot remote-fs-pre.target loaded active active Remote File Systems (Pre) remote-fs.target loaded active active Remote File Systems rescue.target loaded inactive dead Rescue Mode

[Unit]
 Before=shutdown.target reboot.target halt.target

[Service]
 Type=oneshot
 ExecStart=/usr/bin/sh -c "/usr/bin/ddccontrol -r 0xe1 -w 0 dev:/dev/i2c-1"
 RemainAfterExit=yes

[Install]
WantedBy=shutdown.target

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

не, а ты пробовал просто запустить свой скрипт, без выключения. Перед этим закоментируй # Before=

$ sudo systemctl restart monitor.service
если не сработал, проверить на ошибки
$ sudo systemctl -l status monitor.service
сначала так должен вырубиться. Постоянно выключать комп же невозможно

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

напомню после каждого изменения скрипта, если хочешь тестировать сразу надо сделать

$ sudo systemctl daemon-reload

jtad
()
Ответ на: комментарий от jtad
kot@kot-MS-7930:~$ sudo systemctl restart monitor.service
[sudo] пароль для kot: 
Job for monitor.service failed because the control process exited with error code. See "systemctl status monitor.service" and "journalctl -xe" for details.
[sudo] пароль для kot: 
Job for monitor.service failed because the control process exited with error code. See "systemctl status monitor.service" and "journalctl -xe" for details.
kot@kot-MS-7930:~$ systemctl status monitor.service
● monitor.service
   Loaded: loaded (/etc/systemd/system/monitor.service; disabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Срд 2016-07-20 18:49:18 MSK; 1min 57s ago
  Process: 5714 ExecStart=/usr/bin/sh -c /usr/bin/ddccontrol -r 0xe1 -w 0 dev:/dev/i2c-1 (c
 Main PID: 5714 (code=exited, status=203/EXEC)

Ліп 20 18:49:18 kot-MS-7930 systemd[1]: Starting monitor.service...
Ліп 20 18:49:18 kot-MS-7930 systemd[1]: monitor.service: Main process exited, code=exited, 
Ліп 20 18:49:18 kot-MS-7930 systemd[1]: Failed to start monitor.service.
Ліп 20 18:49:18 kot-MS-7930 systemd[1]: monitor.service: Unit entered failed state.
Ліп 20 18:49:18 kot-MS-7930 systemd[1]: monitor.service: Failed with result 'exit-code'.
KOT040188 ★★
() автор топика
Последнее исправление: KOT040188 (всего исправлений: 1)
Ответ на: комментарий от jtad
kot@kot-MS-7930:~$ sudo systemctl -l status monitor.service
● monitor.service
   Loaded: loaded (/etc/systemd/system/monitor.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Срд 2016-07-20 18:56:05 MSK; 2min 44s ago
  Process: 6262 ExecStart=/usr/bin/sh -c /usr/bin/ddccontrol -r 0xe1 -w 0 dev:/dev/i2c-1 (c
 Main PID: 6262 (code=exited, status=203/EXEC)

Ліп 20 18:56:05 kot-MS-7930 systemd[1]: Starting monitor.service...
Ліп 20 18:56:05 kot-MS-7930 systemd[1]: monitor.service: Main process exited, code=exited, 
Ліп 20 18:56:05 kot-MS-7930 systemd[1]: Failed to start monitor.service.
Ліп 20 18:56:05 kot-MS-7930 systemd[1]: monitor.service: Unit entered failed state.
Ліп 20 18:56:05 kot-MS-7930 systemd[1]: monitor.service: Failed with result 'exit-code'.
KOT040188 ★★
() автор топика
Ответ на: комментарий от jtad

Оказывается:

kot@kot-MS-7930:~$ ddccontrol -r 0xe1 -w 0 dev:/dev/i2c-1
ddccontrol version 0.4.2
Copyright 2004-2005 Oleg I. Vdovikin (oleg@cs.msu.su)
Copyright 2004-2006 Nicolas Boichat (nicolas@boichat.ch)
This program comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of this program under the terms of the GNU General Public License.

Чтение EDID и инициализация DDC/CI на шине dev:/dev/i2c-1...
dev:/dev/i2c-1: Отказано в доступе

DDC/CI на dev:/dev/i2c-1 нерабочее (-3).
Если Ваша видеокарта это требует, то проверьте, что все требуемые модули ядра загружены (i2c-dev и драйвер фрейбуфера)
Видимо слетела группа. Я выставаил свою группу для файла монитора, что бы sudo не набирать. С sudo работает.

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

там обрезанно на самом интересном месте. Однако у меня подозрения что как раз после рестарта ddccontrol у тебя и не пашет. Что выдает

$ sudo ddccontrol -p
если работает, то после этого попробуй просто в терминале запустить
/usr/bin/sh -c "/usr/bin/ddccontrol -r 0xe1 -w 0 dev:/dev/i2c-1"

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

Поправил предыдущее сообщение. Sudo ddccontrol -r 0xe1 -w 0 dev:/dev/i2c-1 - работает без проблем. Может в скрипт надо sudo добавить?

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

хаха. Дык я тебе о чем, хде модуль? А ты думал у пользователей бубны полная свобода. Нет, ты пока еще в матрице

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

если так пашет значит и скрипт должен работать. Это пробовал запустить?

/usr/bin/sh -c «/usr/bin/ddccontrol -r 0xe1 -w 0 dev:/dev/i2c-1»

и еще раз

$systemctl -l status monitor.service

-l важно чтобы не обрезался

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

Ну вот. По стандарту sh находится в /bin, но в федоре (и вроде в арче) /bin это ссылка на /usr/bin, поэтому там работает /usr/bin/sh, а у тебя нет.

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

так я же писал вначале - абсолютные пути

$ whereis sh

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

Я уже нашёл. Теперь такая ругань:

kot@kot-MS-7930:~$ /bin/sh -c «/usr/bin/ddccontrol -r 0xe1 -w 0 dev:/dev/i2c-1»
-r: 1: -r: «/usr/bin/ddccontrol: not found
sudo ddccontrol -r 0xe1 -w 0 dev:/dev/i2c-1 по прежнему работает стабильно.

KOT040188 ★★
() автор топика
Последнее исправление: KOT040188 (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.