Перезапуск программы при закрытии ubuntu

Обновлено: 04.07.2024

У меня есть процесс, который выполняется сценарием init.d на фоне. Например:

В определенных условиях myprocess может завершиться с ошибкой и вернуться. Есть ли (стандартный) способ, как обнаружить его сбой и автоматически перезапустить?

У Buildroot есть три возможных системы инициализации, поэтому есть три способа сделать это:

BusyBox init

При этом добавляется запись в /etc/inittab .

Обратите внимание, что init BusyBox имеет уникальный формат /etc/inittab . Второе поле не имеет смысла, а первое поле - это не идентификатор, а базовое имя устройства.

Linux "System V" init

Опять же, добавляется запись в /etc/inittab .

systemd

Например, вы записываете файл модуля в /etc/systemd/system/myprocess.service :

Включите это для автоматического запуска при загрузке с:

Запустите его вручную с помощью:

дальнейшее чтение

Как насчет создания подоболочки с циклом, который постоянно вызывает один и тот же процесс?

Если он заканчивается, следующая итерация цикла продолжается и запускается снова.

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

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

Самый простой способ - добавить его в /etc/inittab, который предназначен для таких вещей:

Например, вы можете сделать это:

У этого также есть много примеров конфигурации для многих случаев использования.

Если вы не являетесь суперпользователем или пользователем root, и если в вашей системе Linux установлен Docker, вы можете создать образ докера вашего процесса, используя docker для перезапуска вашего процесса, если система перезагружается.

Чтобы запустить ваш докер-контейнер,

7 способов "убить" зависшее приложение в Linux

Если у вас возникают такие проблемы, вот несколько способов, как принудительно завершить программу в Linux.

1. Завершить программу в Linux, просто нажав на "X"


Вы, наверное, уже пытались уйти и сделать себе чашечку кофе, но когда вернулись, обнаружили, что ваша программа зависла, вероятно, у него было достаточно времени, чтобы "отвиснуть", но этого не произошло. Зависшее приложение обычно имеет серые неактивные кнопки управления и у него пропадает возможность перемещения.

2. Воспользуйтесь системным монитором, чтобы "убить" процесс Linux


Следующий вариант - открыть утилиту System Monitor вашей операционной системы Linux. Обычно она находится в меню "Системные инструменты" и отображает список запущенных процессов на вкладке "Процессы".

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

  • Остановить: приостанавливает процесс, позволяя продолжить его позже. Не будет работать в большинстве случаев.
  • Завершить: правильный способ закрыть процесс, он безопасно завершит работу приложения, вместе с ним удаляя временные файлы.
  • Убить: вариант на крайний случай и его рекомендуется применять только в случае сбоя.

Лучше всего использовать их по порядку. Однако, если приложение регулярно зависает, можно использовать вариант, в котором вы точно уверены.

3. Принудительное уничтожение процесса Linux с помощью xkill

Другой вариант - использование команды xkill в терминале. Это инструмент принудительного уничтожения процесса, который предустановлен в Ubuntu, но его можно также установить через терминал в других дистрибутивах, если необходимо. xkill позволит закрыть любой процесс. Установить его можно с помощью следующей команды:

Как только установите, наберите:

Вместо указателя мыши появится крест (или череп). Далее необходимо щелкнуть левой кнопкой мыши на зависшем приложении, чтобы закрыть его.

Если невозможно закрыть зависшее приложение одним из этих методов, то решение может быть в терминале Linux.

4. Используйте команду "kill"

Если ни один из вышеперечисленных методов не помог и приложение до сих пор не отвечает, нажмите Ctrl + Alt + T, чтобы открыть терминал.

Есть несколько команд, которые должны помочь закрыть ваше приложение. Более того, их можно использовать как на вашем компьютере, так и подключившись удаленно через SSH.

Команда kill может быть использована только с указанием идентификатора процесса. Сначала выясним его:

В результате вы увидите ID нужного процесса. Далее используем команду:

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


5. Используйте команды "pgrep" и "pkill"

Что, если вы не смогли найти идентификатор процесса. Здесь вам поможет команда pkill.

Кроме того, можно использовать команду pgrep, чтобы найти идентификатор процесса:

После этого используйте команду pkill с ID процесса.


Как и в случае команды kill, процесс должен завершиться в течение 5 секунд.

6. Уничтожить все экземпляры процесса с помощью "killall"

Не повезло с kill или pkill? Пришло время использовать ядерную опцию: killall.

К счастью, она не так разрушительна, какой могла бы быть. Команда killall завершит все экземпляры указанной программы. Таким образом, вместо того, чтобы убивать одно окно Firefox, данная команда завершит их все:

Все, что вам нужно, это имя процесса и команда killall (возможно, с sudo, если этого требует ваша система).

Естественно, вы должны использовать эту команду только при необходимости. Она не подходит для большинства ситуаций.

7. Создайте комбинацию клавиш

Хотите сэкономить время на закрытие не отвечающего программного обеспечения? Наилучшим вариантом является создание сочетания клавиш. Это даст вам возможность немедленно закрыть приложение, но для этого потребуется xkill.

В Ubuntu откройте "Настройки">"Клавиатура" и нажмите "Комбинации клавиш". Выберите Дополнительные комбинации, затем +, чтобы создать новую. Введите "xkill" для названия, затем нажмите "Применить". Это вернет вас к списку комбинаций - выберите нужную, затем нажмите необходимую комбинацию клавиш, которую вы будете использовать для ее вызова.


В следующий раз, когда вам нужно закрыть приложение, просто используйте сочетание клавиш. Указатель мыши станет "X", и вы можете щелкнуть в любом месте приложения, которое хотите закрыть.

Избегайте зависаний программ: обновите свое оборудование

Зависающие программы постоянно вызывают проблемы? Возможно, пора немного обновить ваш компьютер.

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

Итак, в следующий раз, когда приложение или утилита Linux зависнет и перестанет отвечать на запросы, все, что вам нужно сделать, это применить одно из следующих решений:

  1. Завершить программу в Linux, просто нажав на "X".
  2. Воспользуйтесь системным монитором, чтобы "убить" процесс Linux.
  3. Принудительное уничтожение процесса Linux с помощью xkill.
  4. Используйте команду "kill".
  5. Используйте команды "pgrep" и "pkill".
  6. Уничтожить все экземпляры процесса с помощью "killall".
  7. Создайте сочетание клавиш.

Если ни одно из этих решений не работает и вы регулярно испытываете не отвечающие приложения Linux, рассмотрите возможность перехода на облегченную операционную систему Linux.

Я хотел бы запустить .sh файл, используя bash при выходе из системы и выключении Ubuntu. Я искал в Интернете и нашел только исправления для KDE и GNOME. Сценарий прост, мне просто нужно знать, могу ли я добавить строку кода в файл "logoff/shutdown" или мне нужно сослаться на нее в другом сценарии.

2 ответа

Чтобы выполнить скрипт при выходе из системы:

Добавьте следующую строку:

в /etc/lightdm/lightdm.conf файл.

Вы должны перезапустить lightdm, чтобы это изменение вступило в силу. Для этого перейдите в tty1 с помощью Ctrl + Alt + F1 , войдите под своим именем пользователя и паролем и выполните следующую команду:

Примечание: используйте Ctrl + Alt + F7, чтобы перейти к графическому сеансу

Чтобы выполнить скрипт после перезагрузки:

  1. Поместите свой сценарий в /etc/rc0.d
  2. Сделайте его исполняемым: sudo chmod +x K99_script
  3. Заметки:
    • Сценарии в этом каталоге выполняются в алфавитном порядке.
    • Название вашего скрипта должно начинаться с K99 бежать в нужное время.

Чтобы выполнить скрипт при выключении:

  1. Поместите свой сценарий в /etc/rc6.d
  2. Сделайте его исполняемым: sudo chmod +x K99_script
  3. Заметки:
    • Сценарии в этом каталоге выполняются в алфавитном порядке.
    • Название вашего скрипта должно начинаться с K99 бежать в нужное время.

Если вы найдете эту ветку после июня 2016 года, Ubuntu и его производные, включая Mint, будут использовать systemd для управления инициализацией и завершением работы системы. У меня были проблемы со старым подходом, поэтому я исследовал системный подход.

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

Версия GUI

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

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

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

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

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

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

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

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

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

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

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

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

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

Изменение условий запуска для выключения

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

Этот файл был предложен @Matthias в Unix & Linux ответом, но я не смог его запустить, пока не добавил раздел "Установка".

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

Favorite

Добавить в избранное

Главное меню » Операционная система Linux » Как избежать случайного закрытия или перезагрузки в Linux

Как избежать случайного закрытия или перезагрузки в Linux

molly-guard устанавливает скрипт, который перекрывает существующие команды / reboot / halt / poweroff / coldreboot / pm-hibernate / pm-suspend и первым запускает набор сценариев, которые должны успешно пройти molly-guard, прежде чем запускается настоящая команда. Один из сценариев проверяют существующие сеансы SSH. При запуске любого из вышеупомянутых команд в SSH сессии, сценарий оболочки попросит вас ввести имя хоста, который вы хотите выключить или перезагрузить. Это должно адекватно предотвратить вас от случайных отключений и перезагрузок. molly-guard направит реальные двоичные файлы в /lib/molly-guard/. Вы можете, конечно, обойти molly-guard, выполнив эти двоичные файлы непосредственно.

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

Избежание случайного закрытия или перезагрузки Linux с помощью molly-guard

Установка

molly-guard доступен в репозитории по умолчанию в Debian, Ubuntu и других систем на основе DEB, таких как Linux Mint, Elementary OS и т.д.

Чтобы установить molly-guard в системах на основе DEB, выполните следующую команду:

Для распределенных RPM, скачайте пакет Molly-guard.deb, и конвертируйте в качестве собственного пакета Linux, как описано в следующем руководстве. В следующем руководстве, перейдите в раздел под названием “Convert RPM to DEB packages and vice versa” и конвертируйте DEB пакет molly-guard в пакет RPM.

Применение

Пришло время проверить эту утилиту.

Теперь попробуйте выключить или перезагрузить удаленную систему или VPS через SSH:

Видите? molly-guard спрашивает имя хоста вашего сервера Ubuntu. Нажмите CTRL + C, чтобы избежать отключения.

Точно так же можно попробовать все команды отключения питания, перезагрузке системы. molly-guard продолжал спрашивать имя хоста моей системы Ubuntu, чтобы продолжить.

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

Как вы видите, в приведенном выше выводе, мы ввели имя хоста системы Ubuntu (например. destroyer). Теперь, molly-guard знает, что мы действительно хотим отключить свою систему в любом случае, так что это только что сделали.

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

Надеюсь это поможет. Если вы найдете наши гид полезными, поделитесь им в соц сетях!

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Читайте также: