Как в Ubuntu выполнить действие или остановить программу перед переходом в спящий режим |
[исправить] |
Иногда следует перед выполнение перехода в спящий или ждущий режим выполнить
какие-то действия, например, дождаться завершения какого-то процесса или
принудительно завершить его.
Например, в случае использования инструмента резервного копирования backintime
при копировании данных по сети может наблюдаться проблема, вызванная тем, что
backintime блокирует переход в спящий режим до завершения выполнения операции,
но проверка на запуск backintime осуществляется уже после отключения сетевых
интерфейсов, т.е. завершить копирование по сети уже невозможно, что приводит к
сбою в работе backintime и невозможности перевести систему в спящий режим.
В качестве решения проблемы можно создать простой скрипт, который на начальной
стадии перехода в спящий режим дождется завершения выполнения программы.
Создаем /etc/pm/sleep.d/01_backintime:
#!/bin/bash
# Arve Seljebu, may 2010
# check if script parameter is hibernate or suspend
case "${1}" in
hibernate|suspend)
# run loop as long as program /usr/bin/backintime is running
while pgrep -f "/usr/bin/backintime "; do
sleep 5
done
;;
esac
# always exit cleanly
exit 0
Другой проблемой может стать необходимость отмонтирования вручную подключенных
шифрованных или сетевых ФС, например, для отмонтирования encfs-разделов можно
использовать скрипт /etc/pm/sleep.d/20_unmount_storage:
#!/bin/bash
#
# Script which unmounts network storage before suspend and hibernate.
#
# Arve Seljebu. May 2011
PATH=/sbin:/usr/sbin:/bin:/usr/bin
# Which mountpoints we want to umount
MOUNTPOINT[0]=/media/storage/encfs
MOUNTPOINT[1]=/media/storage
#MOUNTPOINT[2]=/media/storage2
# User to run from (user who mounted them)
USER=username
if [ ! -x /bin/mountpoint ]; then
echo "Did not find executable /bin/mounpoint"
exit 0
fi
case "${1}" in
hibernate|suspend)
for i in "${MOUNTPOINT[@]}"
do
# check if the mountpoint is mounted
echo "Checking if mountpoint $i is mounted..."
sudo -u $USER mountpoint $i > /dev/null
if [ "$?" == "0" ]; then
# try to umount with fusermount, if not succsessful, try with umount
echo "Mountpoint $i mounted, umounting..."
fusermount -u $i
if [ "$?" != "0" ];
then umount $i
fi
fi
done
echo "Done..."
exit 0
;;
resume|thaw)
# nothing
;;
esac
По аналогии можно создать скрипты и для обработки других ситуаций.
|
|
|
|
Раздел: Корень / Администратору / Система / Загрузка, однопользовательский режим |
1.2, zomg (?), 11:45, 10/06/2011 [ответить]
| +/– |
Пакеты pm-utils, coreutils и bash отныне работают только в убунту.
s,Ubuntu,GNU/Linux, же!
| |
1.4, Аноним (-), 15:16, 10/06/2011 [ответить]
| +/– |
Извиняюсь, а апстарт случайно не эмитит никаких эвентов при таких событиях? Он бы чертовски логично смотрелся в данном случае и если такое событие эмитится - все выглядело бы в 5 раз проще.
| |
1.5, nub0 (?), 12:46, 11/06/2011 [ответить]
| +/– |
Забыли сделать для созданного скрипта sudo chmod +x
Не сработает же!
| |
1.7, Аноним (-), 00:08, 16/06/2011 [ответить]
| +/– |
> # run loop as long as program /usr/bin/backintime is running
> while pgrep -f "/usr/bin/backintime "; do
> sleep 5
> done
Ужос, так и появляются Шиндошс... Пользователь же сказал - спать! Значит спать. А не бесконечно раз в пять секунд что-то там делать... плохой пример, негодный :(
| |
|