Вопрос или проблема
Я пытаюсь создать простой демон-скрипт на 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 требует понимания, как данное окружение обрабатывает и управляет процессами, заботясь о том, чтобы даже в условиях ограничений можно было достичь желаемого функционала.