В данный момент мой ноутбук начинает иметь то, что я думаю аппаратные проблемы. Иногда я должен попробовать 3 раза, прежде чем это запустится успешно. Я пытаюсь сохранить код, который я изменяю в своей палке usb, но иногда я забываю. Именно поэтому я задаюсь вопросом, существует ли способ запустить скрипт, когда пользователь хочет завершить работу компьютера. Этот сценарий проверит несколько вещей, и в зависимости от ситуации он или отменил бы завершение работы и попросил бы, чтобы пользователь выполнил, некоторое действие (вставьте флеш-карту, например), или выполнитесь, некоторые операторы (сохраните к usb, если это там), и позвольте завершение работы после. Из-за этого необходимого взаимодействия с пользователем, просто подвергающим сценарий/etc/rc0.d, не будет достаточно.
Спасибо
Исходное Сообщение находится в разделе ниже и детализирует, как прервать /sbin/shutdown
команда. Этот раздел основан на systemd ингибиторах.
systemd-запрещение — Выполняет программу со взятой блокировкой ингибирования
systemd-inhibit [OPTIONS...] [COMMAND] [ARGUMENTS...]
systemd-inhibit [OPTIONS...] --list
systemd-запрещение может использоваться для выполнения программы с завершением работы, сном или неактивной взятой блокировкой ингибитора. Блокировка будет получена, прежде чем указанная командная строка выполнена и выпущена впоследствии.
Блокировки ингибитора могут использоваться, чтобы заблокировать или задержать системный сон и запросы завершения работы от пользователя, а также автоматическую неактивную обработку ОС. Это полезно, чтобы избежать, чтобы система приостановила, в то время как оптический диск зарегистрирован, или подобные операции, которые не должны быть прерваны.
Для получения дополнительной информации см. Документацию Разработчика Блокировки Ингибитора.
Следующие опции поняты:
--what=
--who=
--why=
--mode=
--list
-h
, --help
--version
Возвращает статус выхода выполненной программы.
# systemd-inhibit wodim foobar.iso
Это записывает ISO-образ foobar.iso на CD с помощью wodim (1) Примечание: связь разорвана в systemd документации и запрещает системный сон, завершение работы и неактивный при выполнении так.
В понятии это кажется довольно легким. Просто найдите команду, переименуйте ее и замените ее своим собственным сценарием, который называет переименованную версию:
$ 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 - Ваш май Пробега Очень.
Я посмотрел 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
Спасибо