У меня есть небольшой сценарий оболочки, который должен остановить службу. Это должно работать в ubuntu (14.04), debian и Arch. Прямо сейчас то, что я делаю, похоже на
case $(cat /etc/issue) in *Ubuntu*) service command *Debian*) /etc/init.d/servicename command *Arch*) systemctl service command esac
Есть ли лучший способ сделать это?
я бы сказал не смотрите на текущий дистрибутив чтобы определить, какую систему инициализации использовать для управления демонами:
Хотя это не является надежным (система может выбрать установку нескольких систем инициализации рядом друг с другом), я бы сделал это следующим образом: ищите наличие самих инструментов:
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
лично я бы проверил наличие файла и "случай" его на основе этого файла
см. здесь некоторые другие файлы дистрибутива
У Ubuntu и debian есть служебная утилита. Использовать service servicname start|stop
для всего, кроме арки.