Назад | Перейти на главную страницу

портативное управление демонами из bash (sysvinit / upstart / systemd)

У меня есть небольшой сценарий оболочки, который должен остановить службу. Это должно работать в ubuntu (14.04), debian и Arch. Прямо сейчас то, что я делаю, похоже на

   case $(cat /etc/issue) in 
     *Ubuntu*)
       service command
     *Debian*)
       /etc/init.d/servicename command
     *Arch*)
       systemctl service command
   esac

Есть ли лучший способ сделать это?

я бы сказал не смотрите на текущий дистрибутив чтобы определить, какую систему инициализации использовать для управления демонами:

  • Немного туманно определить дистрибутив (как описано в ответе Денниса)
  • используемая система инициализации меняется между версиями дистрибутива (как заметил Майкл Хэмптон, все известные дистрибутивы тяготеют к systemd; Ubuntu в настоящее время является одним из громких противников, и они планируют перейти на него к 2016 году).
  • Система инициализации может быть изменена при индивидуальной установке по умолчанию (начиная с 14.10 Utopic Unicorn в октябре этого года, некоторые установки Ubuntu могут выбрать переход на systemd раньше времени).

Хотя это не является надежным (система может выбрать установку нескольких систем инициализации рядом друг с другом), я бы сделал это следующим образом: ищите наличие самих инструментов:

if command -v systemctl >/dev/null; then
  # assume systemd
  systemctl $command $servicename
elif command -v initctl >/dev/null; then
  # assume upstart
  initctl $command $servicename
elif command -v service >/dev/null; then
  # assume old Debian `service` utility
  service $servicename $command

# ... elif cases for any other utils you'd want to check for ...

else
  # assume bare init.d scripts
  /etc/init.d/$servicename $command
fi

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

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

Если он у вас есть по какой-то другой причине, фасад имеет operatingsystem факт, что делал бы то, что вы хотите.

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

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

Со своей стороны:

Debian: /etc/debian_version
Ubuntu: /etc/lsb-release
Arch: /etc/arch-release

лично я бы проверил наличие файла и "случай" его на основе этого файла

см. здесь некоторые другие файлы дистрибутива

linuxmafia.com

У Ubuntu и debian есть служебная утилита. Использовать service servicname start|stop для всего, кроме арки.