Я сам ввязался в эту проблему и решил сделать несколько тестов. Я полностью согласен с ответом, что каждый дистрибутив должен упаковываться отдельно, но иногда возникают практические проблемы, которые этому мешают (не в последнюю очередь, кадровые).
Итак, для тех, кто хочет "автоопределить", вот что я обнаружил на ограниченном наборе дистрибутивов (подробнее ниже):
Вы можете сказать, начиная с:
.[[ `/sbin/init --version` =~ upstart ]] && echo yes || echo no
Вы можете сообщить Системе из:
.[[ `systemctl` =~ -\.mount ]] && echo yes || echo no
Вы можете сказать sys-v init из:
[[ -f /etc/init.d/cron && ! -h /etc/init.d/cron ]] && echo yes
Вот мои эксперименты со следующей командной строкой:
if [[ `/sbin/init --version` =~ upstart ]]; then echo using upstart;
elif [[ `systemctl` =~ -\.mount ]]; then echo using systemd;
elif [[ -f /etc/init.d/cron && ! -h /etc/init.d/cron ]]; then echo using sysv-init;
else echo cannot tell; fi
на ec2 экземплярах (я включаю в себя наш восточный AMI id):
Просто для ясности: Я не утверждаю, что это глупо! , почти наверняка нет. Также обратите внимание, что для удобства я использую bash regexp спички, которые не везде доступны. Вышеуказанное достаточно хорошо для меня прямо сейчас. Однако, если вы найдете дистрибутив, где он не работает, пожалуйста, дайте мне знать, и я постараюсь исправить это, если есть EC2 AMI, который воспроизводит проблему....