как передать аргументы демону/службе Linux

Я создал демон Linux (на языке C) для отправки определенной информации через UDP на другой компьютер. Для этого требуется, конечно, удаленный IP-адрес и номер порта. Я храню этого демона в /usr/local/bin/ и я также создал скрипт в /etc/init.d/ для запуска|остановки / перезапуска демона.

до сих пор IP-адрес и номер порта передаются демону непосредственно скриптом. Например, часть сценария start () выглядит следующим образом:

start() {
  /usr/local/bin/lvsload_udp_s 192.168.122.25 47239
}

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

каков наилучший способ передачи аргументов моему демону? Спасибо

4 ответов


Почему вы думаете, что параметры командной строки плохие?

файлы конфигурации являются дополнительной работой, так как вам нужно их проанализировать. И, следуя вашему примеру, изменение файла конфигурации = изменение одного файла. Изменение скрипта = изменение одного файла. Не похоже на большую разницу, когда у вас есть только небольшое количество аргументов. Вы даже можете вставить параметры в переменные в верхней части скрипта, что делает его почти как конфигурационный файл : -) некоторые скрипты даже источник таких "скриптов настройки переменных", поэтому он действительно выглядит как файл конфигурации.

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


Q: до сих пор IP-адрес и номер порта передаются Дэймон, напрямую ... Это плохая практика, я знаю.

a: почему вы думаете, что это "плохая практика"????

"хорошие практики" включают в себя:

  • "сухой" (не повторяйтесь - храните данные в одном и только одном месте)

  • " поцелуй "(просто, глупо)

Я бы сказал, один параметр (IP командной строки адрес) в одном скрипте (ваш init.D скрипт запуска) придерживается обоих принципов довольно хорошо:)

ИМХО...

PS:

Если вы действительно считаете, что файл конфигурации подходит - если есть много сложных данных конфигурации, которые необходимо проанализировать при запуске), то два подходящих места будут:

  • сохраните файл конфигурации в /etc (и ваше приложение в /usr/local/bin)

    ... или ..

  • сохраните файл конфигурации в каталоге установки вашего приложения (и, возможно, определите глобальную переменную среды, чтобы указать на каталог установки)


Это конкретный дистрибутив. В debian, например, соглашение заключается в том, что /etc / init.д/ФОО включает в себя строки, как "источник /и т. д./По умолчанию/фу". Этот файл содержит только переменные среды, например DAEMON_ARGS= "--remote-ip=192.168.0.1".

Если вы создадите пакет debian с помощью debhelper, он автоматически создаст эту структуру для вас. Я уверен,что есть аналогичные инструменты для создания "стандартных" RPMs.


использовать переменные среды:

// include stdlib for getenv

port = getenv("MY_DAEMON_PORT");
host = getenv("MY_DAEMON_HOST");

// convert port to integer...

насколько я помню, это несколько условно с процессами, запущенными из init.d.

поскольку вы упомянули, что используете Ubuntu, посмотрите на /etc/environment - см. docs. Но, как кто-то уже упоминал, это зависит от вашей системы/дистрибутива; другой способ-сохранить переменные среды, например /etc/myDaemon.env, затем источник, который из вашего сценария init с:

. /etc/myDaemon.env

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