Как отказаться от команды в оболочке busybox?

Вопрос или проблема

Я пытаюсь создать простой демон-скрипт на shell для домашнего роутера, который использует busybox shell и не поддерживает disown. Есть ли какой-либо способ сделать одно из следующего?

  • Запустить команду как command & и затем отключить ее, когда она уже в фоновом режиме.
  • Запустить команду “напрямую” в фоновом режиме (то есть без использования &).

Это похоже на проблему XY.

Busybox — это очень примитивная оболочка, которая не поддерживает disown.

Но зачем вам вообще нужно использовать disown? Оно уже в фоновом режиме, и если вы выйдете из оболочки, busybox не собирается его убивать. Единственная цель disown — удалить процесс из списка мониторинга оболочки.

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

Кто-то уже упомянул это в комментарии, но посмотрите Отсоединение процесса от Sh (не Bash) или “disown” для Sh (не Bash)

Кратко: используйте nohup command > /dev/null 2>&1 &

Ответ или решение

Введение в тему администрирования систем на основе BusyBox требует понимания ограничений и возможностей, присущих этому упрощенному окружению. BusyBox предоставляет легковесную альтернативу стандартным оболочкам UNIX, однако это часто означает некоторые урезания в функциональности. Ситуация, в которой у пользователя возникает потребность "отказаться" от мониторинга фонового процесса, представляет собой интересную задачу в условиях BusyBox, так как встроенная команда disown не поддерживается.

Теоретические основы

В более полнофункциональных оболочках, например, в bash, команда disown используется для удаления фоновых процессов из списка процессов, за которыми оболочка ведет мониторинг. Это полезно, если вам необходимо завершить сеанс оболочки, не останавливая эти процессы. Однако в BusyBox, с его упрощенными возможностями, такая команда отсутствует, требуя поиска альтернативных решений для задуманной цели.

Пример

При отсутствии возможности использовать disown, фокус может быть перенесен на другие средства управления фоновыми процессами. В контексте BusyBox можно обратить внимание на использование команды nohup, которая позволяет процессу продолжать выполнение даже после выхода из системы. Стандартный синтаксис выглядит следующим образом:

nohup command > /dev/null 2>&1 &

Здесь nohup предотвращает получение процессом сигнала SIGHUP (который обычно посылается при выходе из shell), а перенаправление вывода (> /dev/null 2>&1) устраняет любые нежелательные сообщения на стандартный поток вывода и ошибок. Завершающий амперсанд (&) запускает процесс в фоновом режиме.

Практическое применение

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

#!/bin/sh

# Ваша команда или скрипт, замените 'your_command' на реальную команду
nohup your_command > /dev/null 2>&1 &

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

Заключение

Задача по управлению фоновыми процессами в BusyBox может показаться ограниченной в сравнении с возможностями более функциональных оболочек. Однако, применение традиционных подходов UNIX, таких как nohup, способно компенсировать эту недостаточность. Применение предложенной методики позволит реализовать устойчивое решение для фоновых процессов, значительно увеличив эффективность и стабильность вашего домашнего роутера.

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

Оцените материал
Добавить комментарий

Капча загружается...