Сценарии выхода: не завершено при выключении, перезагрузка

Я пытаюсь выполнить некоторые действия при выходе из системы, и задача может занять до 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.

1
задан 1 February 2013 в 18:22

2 ответа

В 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]

2
ответ дан 25 May 2018 в 01:52
  • 1
    Это не позволит нам узнать, какой пользователь отключает систему. Я ошибаюсь? – falconer 29 December 2013 в 01:39
  • 2
    imho, подумайте над добавлением who и получением вывода в инструкции печати, которая сообщит вам, что в настоящее время вошедшие в систему пользователи, иначе выполнение tail /var/log/auth.log | grep "username" должно дать вам историю sudo пользователя. я не думаю, что есть способ получить единую историю команд пользовательских обычных команд sudo. – ASCIIbetical 29 December 2013 в 14:36
  • 3
    вы можете использовать переменную $USER для определения пользователя – c0rp 30 December 2013 в 14:56
  • 4
    В этом случае, как говорит c0rp, это можно сделать. – ASCIIbetical 30 December 2013 в 15:45
  • 5
    @ASCIIbetical Я подумал, что когда эти скрипты выключения запускают пользователей, они уже вышли из системы, поэтому в выводе who ничего не происходит. Но я никогда не пробовал, поэтому моя мысль могла быть неправильной. Теперь я пробовал, но, к сожалению, это так, как я думал, никакого выхода из who. Выполнение некоторого текстового поиска и фильтрации в журналах, чтобы выяснить, кто был выведен последний из Lightdm, может работать, но, очевидно, простой пары tail-grep будет недостаточно. Если вы обновите свой ответ скриптом, который отфильтровывает имя пользователя ( только имя пользователя ), кто нажал на выключение, это может быть решением. – falconer 1 January 2014 в 16:23

LightDM

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

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

LightDM

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

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

1
ответ дан 25 May 2018 в 01:52
  • 1
    Нет файла /etc/gdm/PostSession/Default. Например, я использую lightdm. Я все равно его создал, но это не помогло. Этот скрипт никогда не запускается. – Jorge Suárez de Lis 1 February 2013 в 16:53
  • 2
    См. Редактирование. Должен работать сейчас .. – abhshkdz 1 February 2013 в 17:27
  • 3
    Мне нужно знать, выходит ли пользователь, и какой пользователь, так что это не поможет. – Jorge Suárez de Lis 1 February 2013 в 17:43
  • 4
    Кроме того, было бы лучше остановиться на сеансе X, потому что мне нужно показать какой-то результат для пользователя. Я добавляю эту информацию на главный пост. – Jorge Suárez de Lis 1 February 2013 в 17:53

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

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