LINUX.ORG.RU

Скрипт выполнения команд до и после спячки

 ,


1

1

Для выполнения команд до и после спячки очень давно использую такой скрипт /usr/lib/systemd/system-sleep/systemmonitorsleep.sh с таким содержанием:

case $1/$2 in
  pre/*)
    ddcutil setvcp D6 05
    ;;
  post/*)
    sleep  5
    ddcutil setvcp D6 01
    sleep 5
    h=`date +%H`
if [ "$h" -ge "7" -a "$h" -le "22" ]
then  
    
    ddcutil setvcp 10 100
else
    
    ddcutil setvcp 10 0
fi
    ;;
esac

Команда ddcutil setvcp D6 05 выполняется перед спячкой, а ddcutil setvcp D6 01 после. Некоторое время назад что-то поломалось и команда перед спячкой перестала работать, при этом команда после спячки работает. Что-то изменилось в синтаксисе и надо поправить? Я в в этом мало понимаю.

★★

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

раньше вроде [code][/code] работал.

Раньше и твой скрипт работал.

Во-первых, что значит «перестал работать»? Скрипт вообще вызывается? Какие параметры получает? Ошибки есть? Какие? Если запускать ddcutil руками — эффект наблюдается? Вставить в скрипт несколько команд echo или printf доступно по силам даже полному чайнику и выяснить что же там происходит.

Во-вторых, неплохо было бы сразу написать что у тебя за система — какая-нибудь из популярных или дикая экзотика. Я могу предположить, что системда у тебя есть, но кто знает… Лучше сразу такое говорить, чем заставлять людей догадываться.

В-третьих, /usr/lib/systemd/system-sleep/systemmonitorsleep.sh — очень странное положение для «твоего» скрипта. Там мог бы лежать какой-нибудь служебный скрипт сервиса. Админу локалхоста доктор прописал лазить в /etc, а править файлы в /usr/lib/systemd/system-sleep/ — некомильфо. Поэтому идеологически более правильный вариант будет не дебажить твой старый скрипт, а гуглить. Где-то на арчвики были пример системдешного сервиса, который исполняет команду перед засыпанием и после просыпания. Хотя подебажить твой старый скрипт всё-таки полезно с точки зрения получения навыков элементарного дебага.

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

Скрипт отрабатывает до и после спячки, выполняет команды. Про место я не скажу ничего, давно было и не помню, мне подсказали, туда и положил. Работал до этой осени замечательно. Куда он может ложить ошибки? Как их посмотреть? Если запускать ddcutil всё работает как швейцарские часы. Опенсуся тамблвид.

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

В-третьих, /usr/lib/systemd/system-sleep/systemmonitorsleep.sh — очень странное положение для «твоего» скрипта. Там мог бы лежать какой-нибудь служебный скрипт сервиса.

Как оказалось, нет. В документации есть только это расположение, и сказано, что оно предназначено исключительно для локальных хаков:

Note that scripts or binaries dropped in /usr/lib/systemd/system-sleep/ are intended for local use only and should be considered hacks. If applications want to react to system suspend/hibernation and resume, they should rather use the Inhibitor interface[1].

[1] https://www.freedesktop.org/wiki/Software/systemd/inhibit

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

Куда вставлять echo или printf я хз.

В первую же строчку скрипта вставляешь

echo "QQQQQQQQ"

Усыпляешь систему, будишь её, далее ищешь в логах строку «QQQQQQQQ». Для начала вот так:

$ journalctl -b0 | grep QQQQQQQQ

Если «QQQQQQQQ» надена, то там же можно найти и ошибки, если они есть. Если в журнале ничего нет, то изменяешь строчку на

echo "QQQQQQQQ" >> ~/qqq.log

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

В последнем случае можно использовать logger. Сначала убедись, что у тебя эта программа установлена. logger отправляет сообщения в системный лог:

$ logger "QQQ: Hello"

$ journalctl -b0 | grep QQQ
Jan 26 10:38:16 antec vdb[1539381]: QQQ: Hello

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

Я бы ещё скрипт радикально переделал:

for f in /etc/suspend/$1.d/*.sh; do
    if [[ -x $f ]]; then
        $f $2
    fi
done
debugger ★★★★★
()
Ответ на: комментарий от KOT040188

Вот откуда всё пошло. Там есть много разбирательств из-за кодировки файла скрипта, но в целом тогда всё заработало.

Ты свои сообщения перед отправкой читаешь? Я не Жириновский удалённо тараканов в твоей голове рентгеном просвечивать. Откуда пошло?? Где «там»??

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

В логах обнаружил:

лют 07 09:30:13 localhost.localdomain (sd-executor)[32323]: /usr/lib/systemd/system-sleep/monitorsleep.sh failed with exit status 1.

Может как-то связано с моей проблемой? Файл скрипта я переименовал немного, если что.

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

Может как-то связано с моей проблемой?

Прикинь, связано.

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

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

#!/bin/sh почему-то не пропечатался, но он есть. Сам скрипт не должен работать по идее, он работает по условию до спячки и после. А команды которые в нём работают.

KOT040188 ★★
() автор топика

попробуй такой

case "$1" in
    	pre)	/usr/bin/ddcutil setvcp D6 05
		exit 0
		   ;;
  post) 
    /usr/bin/sleep  5
    /usr/bin/ddcutil setvcp D6 01
    /usr/bin/sleep 5
    h=`date +%H`
if [ "$h" -ge "7" -a "$h" -le "22" ]
then  
    
    /usr/bin/ddcutil setvcp 10 100
else
    
    /usr/bin/ddcutil setvcp 10 0
fi
exit 0
    ;; 	
    *)	exit 1
		;;
esac
anonymous
()
Ответ на: комментарий от KOT040188

Копал, копал, ничего не накопал. Всё мимо…

Повторяю: Либо задавай разумные и конкретные вопросы, либо досвидос. Я своё свободное время, которого у меня много, лучше потрачу на что-нибудь более интересное.

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

Там по ссылке два способа ловли события спячки. Первый способ поначалу работал. Но иногда он пропускает спячку и не отрабатывает перед ней и после, потом снова работает. Редко, но бывает. Решил попробовать второй способ. Второй способ работает наполовину как в шапке темы, только наоборот, при входе в спячку работает, а при выходе нет. В итоге идеального юнита не нашёл. Может у кого какие мысли есть?

KOT040188 ★★
() автор топика