Сценарии выхода из системы: не завершены при завершении работы, перезагрузите компьютер

Я пытаюсь что-то сделать при выходе из системы, и задача может занять до 5 минут.

Если пользователь выбирает Power off или Reboot напрямую, сценарий уничтожается до его завершения. Если пользователь просто выбирает Log out, сценарий выполняется без проблем.

Я пытался использовать свойства pam_exec и lightdm session-cleanup-script, чтобы указать на мой скрипт, но в обоих случаях он одинаков.

Сценарий, используемый для тестирования, является следующим:

#!/bin/bash
touch /tmpfile
for p in $(seq 0 300) ; do
    sleep 1
    echo $p >> /tmpfile
done

При выходе из системы все 300 чисел записываются в файл. При выключении или перезагрузке непосредственно из пользовательского сеанса записываются только 2 или 3 числа, поэтому сценарий уничтожается.

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

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

5
задан 1 February 2013 в 16:22

3 ответа

В Ubuntu сценарии для разных уровней выполнения выполняются в соответствии с их присутствием в каталогах /etc/rc[0-6].d. Runlevel 0 соответствует выключению, а 6 - перезагрузке.

Обычно скрипт хранится в /etc/init.d, а затем символические ссылки помещаются в каталоги, соответствующие требуемым уровням выполнения.

Итак, в вашем случае напишите свой сценарий, сохраните его в /etc/init.d/, затем создайте символическую ссылку в каждом из /etc/rc0.d и /etc/rc6.d (если вы хотите оба), указывающую на ваш сценарий.

Создайте символическую ссылку, например: /etc/rc0.d/K01myscipt -> /etc/init.d/myscript

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

1127 Надеюсь, что это решит. Не забудьте сделать его исполняемым (sudo chmod + x myscript). Кроме того, я не уверен, но, возможно, вам придется отменить выключение в начале сценария - shutdown -c now и выполнить его снова в конце - shutdown -h now.

Теперь нужно знать, кто издал команду shutdown:
1) Либо, ну, вы можете сделать это с помощью сценария оболочки следующим образом:

a. mv /sbin/shutdown /sbin/shutdown-orig
b. vim /sbin/shutdown #!/bin/sh echo "$USER has initiated the shutdown process" >> /var/log/shutdown.owner /sbin/shutdown-orig "$@"
c. chmod 755 /sbin/shutdown

2) Или обычный пользователь имеет доступ только к команде shutdown с помощью команд sudo и sudo: обычно) регистрируется под /var/log/. Итак, вы можете проверить это. Надеюсь, поможет. Для получения дополнительной информации, пожалуйста, обратитесь к моей теме здесь . Не забудьте зайти и сказать спасибо им.

РЕДАКТИРОВАТЬ: В заключение, если ничего не работает, попробуйте использовать sudo и заблокировать доступ к выключению / перезагрузке, и только тогда вы сможете проверить журналы и узнать, кто инициировал процесс выключения. Подробности в содержании ниже. Благодарю. Wonderful Question, Learnt a Lot. [одна тысяча сто тридцать одна]

0
ответ дан 1 February 2013 в 16:22

LightDM

Создать скрипт в /etc/rc0.d.

sudo vim /etc/rc0.d/myScript
sudo chmod +x /etc/rc0.d/myScript

GDM

Добавьте свою команду в файл /etc/gdm/PostSession/Default перед строкой exit 0.

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

0
ответ дан 1 February 2013 в 16:22

Для этого я объединил три механизма:

  • Сценарий выхода из Lightdm, который получает информацию о пользователе и записывает ее во временный файл, чтобы мы могли знать, кто выключает компьютер. Это также делает тяжелую задачу в случае, если мы не выключаемся или не перезагружаемся.
  • Традиционные сценарии initrd для выполнения тяжелых задач при завершении работы или перезагрузке.
  • Плимутские сообщения о состоянии, чтобы дать обратную связь об этих тяжелых задачах при выключении или перезагрузке.

Итак, у меня есть сценарий тяжелой задачи на /usr/local/bin/heavy.sh:

#!/bin/bash 
touch /tmpfile 
for p in $(seq 0 300) ; do
    sleep 1
    echo $p >> /tmpfile
    if [ ! -z $DISPLAY ] ; then
        notify-send "Written $p"
    else 
        plymouth message --text="Written $p" &>/dev/null
    fi
done

Эта тяжелая задача пытается вывести информацию в X. Если это не удается, пытается сделать это в Плимут. 1113]

Затем я добавил эту строку в конфигурацию Lightdm на /etc/lightdm/lightdm.conf:

session-cleanup-script=/usr/local/sbin/logout-tasks.sh

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

#!/bin/bash
echo $USER > /run/last-logout-user
/usr/local/bin/heavy.sh

Сценарий initrd, расположенный по адресу /etc/init.d/logout-heavy-task-at-shutdown:

#!/bin/bash
USER_RUN=$(cat /run/last-logout-user)
sudo -u $USER_RUN /usr/local/bin/heavy.sh

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

 update-rc.d -n logout-heavy-task-at-shutdown start 05 0
 update-rc.d -n logout-heavy-task-at-shutdown start 05 6

И это все. Тяжелая задача, возможно, придется обрабатывать, когда она уничтожается X, а затем снова запускается сценарием initrd. В зависимости от задачи это может вообще не быть проблемой.

0
ответ дан 1 February 2013 в 16:22

Другие вопросы по тегам:

Похожие вопросы: