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

В данный момент мой ноутбук начинает иметь то, что я думаю аппаратные проблемы. Иногда я должен попробовать 3 раза, прежде чем это запустится успешно. Я пытаюсь сохранить код, который я изменяю в своей палке usb, но иногда я забываю. Именно поэтому я задаюсь вопросом, существует ли способ запустить скрипт, когда пользователь хочет завершить работу компьютера. Этот сценарий проверит несколько вещей, и в зависимости от ситуации он или отменил бы завершение работы и попросил бы, чтобы пользователь выполнил, некоторое действие (вставьте флеш-карту, например), или выполнитесь, некоторые операторы (сохраните к usb, если это там), и позвольте завершение работы после. Из-за этого необходимого взаимодействия с пользователем, просто подвергающим сценарий/etc/rc0.d, не будет достаточно.

Спасибо

2
задан 27 February 2018 в 03:08

2 ответа

Используйте systemd ингибиторы

Исходное Сообщение находится в разделе ниже и детализирует, как прервать /sbin/shutdown команда. Этот раздел основан на systemd ингибиторах.

От systemd ингибитора:

Имя:

systemd-запрещение — Выполняет программу со взятой блокировкой ингибирования

Резюме

systemd-inhibit [OPTIONS...] [COMMAND] [ARGUMENTS...]

systemd-inhibit [OPTIONS...] --list

Описание

systemd-запрещение может использоваться для выполнения программы с завершением работы, сном или неактивной взятой блокировкой ингибитора. Блокировка будет получена, прежде чем указанная командная строка выполнена и выпущена впоследствии.

Блокировки ингибитора могут использоваться, чтобы заблокировать или задержать системный сон и запросы завершения работы от пользователя, а также автоматическую неактивную обработку ОС. Это полезно, чтобы избежать, чтобы система приостановила, в то время как оптический диск зарегистрирован, или подобные операции, которые не должны быть прерваны.

Для получения дополнительной информации см. Документацию Разработчика Блокировки Ингибитора.

Опции

Следующие опции поняты:

--what=

  • Берет разделенный от двоеточия список одной или нескольких операций для запрещения: "завершение работы", "сон", "неактивный", "ключевой для питания для дескриптора", "handle-suspend-key", "handle-hibernate-key", "переключатель крышки дескриптора", для запрещения reboot/power-off/halt/kexec, приостановки/спящего режима, автоматического неактивного обнаружения или обработки низкого уровня ключа питания/сна и переключателя крышки, соответственно. Если опущено, значения по умолчанию к "idle:sleep:shutdown".

--who=

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

--why=

  • Берет короткую, человекочитаемую описательную строку по причине взятия блокировки. Значения по умолчанию к "Неизвестной причине".

--mode=

  • Берет или "блок" или "задержку" и описывает, как блокировка применяется. Если "блок" используется (значение по умолчанию), блокировка запрещает любую из требуемых операций без ограничения по времени, и только привилегированные пользователи могут переопределить его. Если "задержка" используется, блокировка может только задержать требуемые операции на ограниченный срок. Если время протекает, блокировка проигнорирована и выполняемая операция. Ограничение по времени может быть указано в logind.conf (5). Обратите внимание, что "задержка" только доступна для "сна" и "завершения работы".

--list

  • Списки все активное ингибирование блокируют вместо того, чтобы получить то.

-h, --help

  • Распечатайте короткий текст справки и выход.

--version

  • Распечатайте строку короткой версии и выход.

Статус выхода

Возвращает статус выхода выполненной программы.

Пример

# systemd-inhibit wodim foobar.iso

Это записывает ISO-образ foobar.iso на CD с помощью wodim (1) Примечание: связь разорвана в systemd документации и запрещает системный сон, завершение работы и неактивный при выполнении так.

См. также

systemd (1), logind.conf (5)


Исходное сообщение

В понятии это кажется довольно легким. Просто найдите команду, переименуйте ее и замените ее своим собственным сценарием, который называет переименованную версию:

$ type -a shutdown
shutdown is /sbin/shutdown
$ sudo mv /sbin/shutdown /sbin/shutdownoriginal

Затем отредактируйте свой собственный сценарий в /sbin/shutdown содержа по крайней мере:

#!/bin/bash
/sbin/shutdownoriginal

Затем отметьте свой сценарий как исполняемый файл для всех:

$ sudo chmod a+x /sbin/shutdown

Вуаля! Все, что называет завершение работы теперь, называет Ваш сценарий, который затем называет исходную команду.

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

echo "/sbin/shutdown custom script calling /sbin/shutdownoriginal"
shutdowntime=`date`
echo "Last shutdown: $shutdowntime" >> /home/rick/shutdownlog.txt

Первое echo должен был появиться в /var/log/syslog но это не сделало. Второе echo должен был добавить строку к файлу журнала, но он не сделал. Это говорит мне что к этому времени /sbin/shutdown команда является выполняемым системным входом, уже выключен, и система файлового ввода-вывода является завершением работы.

Лучший подход посмотрел бы на цель завершения работы systemd и/или вводить ингибиторы. Я оставлю этот ответ здесь, хотя для других, которые могли бы думать это работа could/would/should.

Как всегда помнят YMMV - Ваш май Пробега Очень.

2
ответ дан 2 December 2019 в 03:34

Я посмотрел systemd-запрещение

, Что я понял, то, что при использовании его перед командой, оно ожидает до команды / закрываются концы сценария перед системой, существуют некоторые опции заблокировать завершение работы, но не казалось очевидным сделать мне. На данный момент Ваше первое предложение работает на меня (я не возражаю вводить "завершение работы" вместо графического интерфейса). Вот основной сценарий как пример:

#!/bin/bash

if [ ! -d /media/myusername/myusbname ]; then
  zenity --question --text "Are you sure you want to shutdown without saving? If not choose \"No\" and insert the usb key" 2> /dev/null
  answer=$?
else
  #save data
  answer=0
fi
if [ $answer -eq 0 ]; then
  /sbin/shutdownoriginal
else
  zenity --info --text="Shutdown canceled" 2> /dev/null
fi

Спасибо

0
ответ дан 2 December 2019 в 03:34

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

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