Я пытаюсь выполнить некоторые действия при выходе из системы, и задача может занять до 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 числа, поэтому скрипт убивается.
Как обрабатывается shutdown by lightdm? Как я могу гарантировать, что мой скрипт не будет убит?
Если вы предлагаете альтернативный подход, пожалуйста, позаботьтесь о том, чтобы мне нужно было узнать, что пользователь выходит из системы, и иметь возможность запускать скрипт в качестве этого пользователя. Мне также нужно уведомить пользователя о том, что происходит, поэтому лучше по возможности оставаться на X.
В Ubuntu скрипты для разных уровней выполнения выполняются в соответствии с их присутствием в каталогах /etc/rc[0-6].d. Runlevel 0 соответствует завершению работы и 6 для перезагрузки.
Обычно сценарий хранится в /etc/init.d, а затем символические ссылки помещаются в каталоги, соответствующие требуемым уровням выполнения.
[d2 ] Итак, в вашем случае напишите свой скрипт, сохраните его в /etc/init.d/, затем создайте символическую ссылку в каждом из /etc/rc0.d и /etc/rc6.d (если вы хотите, чтобы оба) указывали на ваш скрипт.Создать символическая ссылка: /etc/rc0.d/K01myscipt -> /etc/init.d/myscript
Скрипты в каждом каталоге уровня выполнения будут выполняться в ASCII-бите, а если порядок в пределах уровня выполнения имеет значение для вас, выберите имя вашей символической ссылки соответственно.
Надеюсь, что это решает. Не забудьте сделать его исполняемым (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/. Итак, вы можете это проверить. Надеюсь, поможет. Для получения дополнительной информации, любезно обратитесь к моей теме здесь. Не забудьте зайти и сказать им спасибо.
EDIT: Заключение. Если ничего не работает, попробуйте использовать sudo и отключите доступ к завершению работы / перезагрузке, а затем только вы можете проверить журналы и узнать, кто инициировал процесс останова. Подробности в содержании ниже. Благодарю. [F18]
LightDM
Создайте скрипт в /etc/rc0.d.
sudo vim /etc/rc0.d/myScript
sudo chmod +x /etc/rc0.d/myScript
LightDM
Добавьте свою команду в файл /etc/gdm/PostSession/Default перед строкой exit 0.
Как и до выключения, пользователь в любом случае отключается, это должно охватывать обе базы.