Я пытаюсь что-то сделать при выходе из системы, и задача может занять до 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, если это возможно.
В 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.
[одна тысяча сто тридцать одна]
LightDM
Создать скрипт в /etc/rc0.d
.
sudo vim /etc/rc0.d/myScript
sudo chmod +x /etc/rc0.d/myScript
GDM
Добавьте свою команду в файл /etc/gdm/PostSession/Default
перед строкой exit 0
.
Как и до выключения, пользователь все равно выходит из системы, это должно охватывать обе базы.
Для этого я объединил три механизма:
Итак, у меня есть сценарий тяжелой задачи на /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. В зависимости от задачи это может вообще не быть проблемой.