LINUX.ORG.RU

systemd и system-sleep останавливаются скрипты

 , , ,


0

1

Создал скрипт для очистки swap после выхода из гибернации.

d=`date`
echo $d >> /home/user/alldone
echo "--------" >> /home/user/alldone
a=`cat /proc/meminfo | grep SwapFree | sed 's/[a-zA-Z: ]*//g'`
while [ "$a" != "0" ]
do
nice -n -20 swapoff -a
sleep 5
a=`cat /proc/meminfo | grep SwapFree | sed 's/[a-zA-Z: ]*//g'`
done
sleep 3
swapon -a
d=`date`
echo $d >> /home/user/alldone
echo "------------------------" >> /home/user/alldone
Но скрипт не успевает отработать т.к. после выхода, скрипт (любой, делал скрипты с выводом чисел в файл каждую секунду) через 80-90 секунд останавливается. Подскажите где искать или как увеличить этот таймер. Система debian 9 ядро 4.17.0-0

Если ты очистишь своп до того, как запущенные до гибернации приложения выгрузятся обратно память, гибернация не будет иметь смысла.

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

Ох еп,

#!/bin/sh
case $1/$2 in
  pre/*)
    ;;
  post/*)
a=`cat /proc/meminfo | grep SwapFree | sed 's/[a-zA-Z: ]*//g'`
while [ "$a" != "0" ]
do
nice -n -20 swapoff -a &>> /home/user/alldone
sleep 5
a=`cat /proc/meminfo | grep SwapFree | sed 's/[a-zA-Z: ]*//g'`
done
sleep 3
swapon -a
    ;;
esac
Так понятнее?

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

Чот ты лютую костылину ваяешь. Лучше юнит покажи, подозреваю, что ты там Timeout просрал или что-то типа того.

mord0d ★★★★★
()

Покажи как именно и откуда ты запускаешь этот скрипт.

В systemd есть TimeoutStartSec, значение которого по умолчанию равно DefaultTimeoutStartSec из общесистемного конфига. А DefaultTimeoutStartSec по имолчанию равно 90 (секунд).

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

Так понятнее?

Неа. :) Накой grep, если юзаете sed, и уж тем более накой cat?

$ a=`cat /proc/meminfo | grep SwapFree | sed 's/[a-zA-Z: ]*//g'`
vs
$ a=`sed -rn '/^SwapFree:/{s/.*([0-9]+).*/\1/p;q}' /proc/meminfo`

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

Ближе к моему примеру будет

a=`sed -rn '/^SwapFree:/{s/[a-zA-Z: ]*//gp;q}' /proc/meminfo`
Или смысл в просмотре последней цифры свободного объема?

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

Ближе к моему примеру будет

А, ну да. Впрочем, можно и мой исправить:

sed -rn '/^SwapFree:/{s/[^0-9]+([0-9]+).*/\1/p;q}'

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

Скрипт запускается из /lib/systemd/system-sleep из файла swap

В /etc/systemd/system.conf раскомментировал и установил параметры

DefaultTimeoutStartSec=600s
DefaultTimeoutStopSec=600s
Эффекта не последовало. Что я делаю не так?

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

Для этих скриптов таймаут захардкодили на 90 секунд, смотри вызовы execute_directories() в $SYSTEMD_SRC/src/sleep/sleep.c.

Тебе нужно либо как-то запускать свой скрипт нормальным сервисом, привязанным к systemd-hibernate.service, либо чинить таймаут в коде systemd.

По идее, можно просто в /etc/systemd/system/systemd-hibernate.service.d/ добавить файл с ExecStartPost=твой_скрипт и он будет выполняться после гибернации. (я не уверен, что это - единственный и правильный способ)

Кстати, что будет, если новая гибернация начнётся до того, как твой скрипт завершится? И что будет, если всё содержимое свопа уже не лезет в оперативную память?

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

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

По идее, можно просто в /etc/systemd/system/systemd-hibernate.service.d/ добавить файл с ExecStartPost=твой_скрипт и он будет выполняться после гибернации. (я не уверен, что это - единственный и правильный способ)

Это пока наилучший вариант который я увидел, не подскажите где посмотреть реализацию, не до конца понимаю, ExecStartPost это название файла? Или systemd-hibernate.service.d должен являться файлом? У меня нет systemd-hibernate.service.d ни в качестве файла, ни в качестве папки. И в данном случае скрипт будет выполняться без ограничения по времени?

Im_not_robot
() автор топика

Не очень понимаю смысл swapoff после гибернейта. Но если очень надо, думаю лучше посмотреть сюда https://unix.stackexchange.com/questions/45673/how-can-swapoff-be-that-slow. Там среди ответов есть рабочий набросок для быстрого подъема свопа в память, основанный на том что своп читается последовательно с диска, а не рандомно, как это сделано в ядре.

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

Это пока наилучший вариант который я увидел, не подскажите где посмотреть реализацию, не до конца понимаю, ExecStartPost это название файла? Или systemd-hibernate.service.d должен являться файлом? У меня нет systemd-hibernate.service.d ни в качестве файла, ни в качестве папки.

Это такой стандартный способ изменения системных сервисов без изменения файлов в /lib/systemd/system/, которые ставятся из пакетов и не должны редактироваться вручную.

В твоём случае нужно переместить скрипт из /lib/systemd/system-sleep/ в какое-нибудь другое место. Затем нужно создать директорию /etc/systemd/system/systemd-hibernate.service.d, в неё положить файл с каким-нибудь именем .conf (например: 50-add-my-script.conf) и примерно таким содержимым:

[Service]
ExecStartPost=/новый/путь/к/твоему/скрипту post hibernate
Затем нужно сделать
systemctl daemon-reload
И всё должно работать. Надеюсь, никаких дополнительных таймаутов для ExecStartPost не существует...

Возможно, всё то же самое тебе нужно проделать также для systemd-hybrid-sleep.service и systemd-suspend-then-hibernate.service.

Кстати, похоже есть ещё один способ сделать то, что ты хочешь: создать отдельный сервис для твоего скрипта, указать что он должен работать стого после systemd-hibernate.service и добавить его в hibernate.target.

И в данном случае скрипт будет выполняться без ограничения по времени?

Да, должен без ограничения по времени.

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

Спасибо большое, таймера на отработку скрипта, действительно нет. По поводу сервиса, пока не буду заморачиваться. systemd-hybrid-sleep.service и systemd-suspend-then-hibernate.service не пришлось колдовать.

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

Ииии... скрипт не пашет, бьет ошибки и не пашет. Но спасибо за информацию. Буду пока использовать костыли со swapoff и ExecStartPost, пока не попадется что-то получше.

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