Выполните команду перед завершением работы

С ansi, cygwin, Linux, vt100, vt220, и xterm terminfo определения, я ожидаю, что Вы смогли бы поразить 98% эмуляций терминала, с которыми Вы встретитесь в дикой природе.

Даже эмуляторы терминала, которые имеют другой режим работы в собственной системе команд, могут, вероятно, быть предписаны эмулировать vt100/vt220 режимы, часто без вмешательства пользователя.

54
19.01.2018, 14:13
4 ответа

Linux Mint основан на Ubuntu, таким образом, я предполагаю, что runlevel система является, вероятно, тем же. На Ubuntu сценарии для другого runlevels выполняются согласно их присутствию в /etc/rc[0-6].d каталоги. Runlevel 0 соответствует завершению работы, и 6 для перезагрузки.

Обычно сам сценарий хранится в /etc/init.d, и затем символьные ссылки помещаются в каталоги, соответствующие runlevels, которого Вы требуете.

Таким образом в Вашем случае, запишите свой сценарий, сохраните его в /etc/init.d/, затем создайте символьную ссылку в каждом из /etc/rc0.d и /etc/rc6.d (если Вы хотите обоих), указывающий на Ваш сценарий.

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

43
27.01.2020, 19:33
  • 1
    я просто смотрел на скелетный файл в init.d (kubuntu точный) и стал немного запуганным. Я просто хочу добавить несколько команд, которые повторяют дату завершения работы в файл под/var/log. Я могу просто сделать это, или я должен иметь дело с некоторыми из других вещей в скелетном файле? прохладный –  Joe 28.09.2012, 23:02
  • 2
    @Joe - Вам не нужна большая часть того материала, если Вы не хотите, чтобы Ваш сценарий был управляем как стандартный сервис. Вы ничего не повредите с простым эхом к Вашему собственному файлу журнала, так попробуйте его и посмотрите. –  ire_and_curses 29.09.2012, 02:34
  • 3
    Вот является простая выборка init.d сценарием. Кроме того, это легче и более устойчиво для создания использования символьных ссылок sudo update-rc.d /etc/init.d/myservice defaults –  RolfBly 09.12.2014, 19:12
  • 4
    я записал/etc/init.d/spark_shutdown.sh и создал ссылку в/etc/rc0.d и/etc/rc6.d теперь, как я подтверждаю, что этот сценарий работал в экземпляре ubuntu aws ec2 –  Ashish Karpe 26.07.2017, 11:48

Необходимо использовать rc.shutdown сценарий завершения работы для Ядра Linux. Заключение в кавычки страницы справочника OpenBSD:

Когда система закрывается с помощью перезагрузки (8), или остановитесь (8) команды, или когда init (8) сообщен, чтобы сделать так, или когда требуемый на клавиатуру останов выпущен (если архитектура поддерживает его), дистанционное управление (8) вызывается с аргументом ''завершение работы''.

Так, Вы просто открываете свой rc.shutdown и добавляете, что любая оболочка управляет, чтобы Вы хотели выполниться к нему.

ОБНОВЛЕНИЕ: Так как Linux Mint основан на Ubuntu, которая имеет другую процедуру запуска/завершения работы, вот процедура, относящаяся к Вам:

Запишите сценарий оболочки, Вы хотите выполнить и скопировать его в соответствующий каталог в Вашем /etc/rc*.d/. * соответствует runlevel, в котором Вы хотите, чтобы сценарий выполнился.
Ubuntu следует за нумерацией Debian runlevel, таким образом, у Вас есть runlevel 0 для останова и runlevel 6 для перезагрузки.

7
27.01.2020, 19:33

Теперь, когда варианты Ubuntu и Mint перешли на systemd, я обнаружил, что мои старые решения, основанные на вышеизложенном, менее удовлетворительны. Я поискал в Интернете, как это сделать с помощью systemd, и в итоге объединил мудрость других и задокументировал это в виде сообщения в блоге на blogspot.com.au , содержащего следующий учебник.

С помощью systemd вы создаете один или два файла для вызова ваших скриптов, используя указанные ниже шаблоны, и выполняете несколько команд. Простой.


Версия графического интерфейса пользователя

Сначала создайте сценарии, которые нужно запускать при запуске и / или завершении работы. Я создал .scopening_atstart и .scfullcopy_atend.

Затем убедитесь, что они оба являются исполняемыми, щелкнув файл правой кнопкой мыши, выбрав свойства и убедившись, что в разделе разрешений вы отметили «Разрешить выполнение файла как программу».

Два файла, которые я создал, заполняют и сохраняют содержимое виртуального диска. Они также создают файл в моем домашнем каталоге, чтобы доказать, что служба работает. Они имели вид:

#!/bin/sh
cp -pru /home/john/zRamdisk/subdirectory1/* /home/john/.wine/drive_c/subdirectory1/
rm /home/john/stop_time
date +%D' '%T > /home/john/stop_time

Затем я открыл свой файловый менеджер как root, открыл / etc / systemd / system и создал файл startup.service и файл save-ramdisk.service. Очевидно, вы можете выбрать свои собственные имена, и общие имена могли включать файл запуска с именем johns_start.service и файл завершения работы с именем johns_shutdown.service. Только не выбирайте существующие названия сервисов.

[Unit]
Description=Startup Applications

[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/john/.scopening_atstart

[Install]
WantedBy=multi-user.target

и

[Unit]
Description=Save Ramdisk to Wine drive C

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/john/.scfullcopy_atend

[Install]
WantedBy=multi-user.target

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

Наконец, для каждого выполните команду systemctl enable your_files_name (но без суффикса service). Итак, моей первой была systemctl enable startup

Перезагрузите компьютер один раз, чтобы запустить службы. Служба запуска будет выполняться всякий раз, когда systemd входит в многопользовательскую цель, а служба остановки - при выходе из многопользовательской цели. Ниже будут описаны альтернативные служебные файлы с другими условиями активации.


CLI (командная строка) Версия

Это описание предполагает, что вы работаете из своего домашнего каталога, а не из / home / john, используете sudo по мере необходимости и ваш выбор редактора, в котором я пишу vim или svim.

Создайте сценарии запуска и завершения работы оболочки с первой строкой #! / Bin / sh и сделайте их исполняемыми с помощью chmod + x my_new_filename .

Создайте два файла, как указано выше, или, в этом примере, один файл для обработки задач запуска и завершения работы. Я буду выполнять сценарии в моем домашнем каталоге, но @don_crissti показывает некоторые альтернативы на Stack Exchange .

vim /etc/systemd/system/start_and_stop.service

и скопируйте содержимое файла:

[Unit]
Description=Run Scripts at Start and Stop

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/home/john/.startup_commands  #your paths and filenames
ExecStop=/home/john/.shutdown_commands

[Install]
WantedBy=multi-user.target

Затем включите службу с помощью команды:

systemctl enable start_and_stop

и перезагрузите систему, после чего службы станут активными. Команды systemctl is-enabled start_and_stop и systemctl is-active start_and_stop могут использоваться для мониторинга ваших новых служб.


Изменение условий запуска для завершения работы

Файлы, прежде всего, используют открытие или закрытие многопользовательской среды для запуска выполнения сценариев.В приведенном ниже файле для запуска сценариев используется начало четырех потенциальных процессов завершения работы. Добавление или удаление целей в строке До + строке WantedBy позволит вам более точно различать:

Этот файл был предложен во втором ответе этого сообщения , но я не смог запустить его, пока не добавил раздел «Установка».

Снова отредактируйте сценарий в / etc / systemd / service / и включите его с помощью systemctl enable your_file_name . Когда я изменил целевые объекты, я использовал команду systemclt disable file_name , а затем снова включил ее, которая символически связала ее с целевыми каталогами. Перезагрузитесь, и служба будет работать.

[Unit]
Description=Do something required
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
# This works because it is installed in the target and will be
#   executed before the target state is entered
# Also consider kexec.target

[Service]
Type=oneshot
ExecStart=/home/john/.my_script  #your path and filename

[Install]
WantedBy=halt.target reboot.target shutdown.target
11
27.01.2020, 19:33

Для систем инициализации на основе зависимостей SysV, используемых в Debian Wheezy, Devuan и его производных и, возможно, других, вы можете имитировать поведение rc.shutdownаналога rc.localследующим образом:

Добавьте свои команды в следующий скелет/etc/rc.shutdown:

#!/bin/sh -e
#
# rc.shutdown
#

# <add your commands here, before exit 0>

exit 0

Сохраните сценарий и сделайте файл исполняемым с помощью chmod a+x /etc/rc.shutdown.

Затем добавьте в систему новый скрипт /etc/init.d/rc.shutdownсо следующим содержимым:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          rc.shutdown
# Required-Start:
# Required-Stop:
# X-Stop-After:      umountroot
# Default-Start:
# Default-Stop:      0 6
# Short-Description: Run /etc/rc.shutdown if it exist
### END INIT INFO


PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/init/vars.sh
. /lib/lsb/init-functions

do_stop() {
    if [ -x /etc/rc.shutdown ]; then
            [ "$VERBOSE" != no ] && log_begin_msg "Running local shutdown scripts (/etc/rc.shutdown)"
        /etc/rc.shutdown
        ES=$?
        [ "$VERBOSE" != no ] && log_end_msg $ES
        return $ES
    fi
}

case "$1" in
    start)
        # No-op
        ;;
    restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
    stop|status)
    do_stop
        exit 0
        ;;
    *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac

Также сделайте этот скрипт исполняемым.

Создайте символические ссылки в /etc/rc[06].d:

cd /etc/rc0.d ; ln -s../init.d/rc.shutdown K01rc.shutdown

и

cd /etc/rc6.d ; ln -s../init.d/rc.shutdown K01rc.shutdown

Используйте insservдля исправления символических ссылок и создания необходимых файлов.depend.boot,.depend.start и.depend.stop:

insserv -v

Вы должны быть root или использовать sudo для всех упомянутых выше команд.

1
27.01.2020, 19:33

Теги

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