Получение имени хоста машины с помощью systemd
.
Хотя я не очень хорошо знаком с systemd
просматривающей этот учебный веб-сайт, а также с официальными справочными страницами по systemd
, вы, похоже, ищете «спецификатор»:
Многие настройки разрешают спецификаторы, которые могут использоваться для записи общих файлов модулей, ссылающихся на параметры времени выполнения или параметры модулей, которые заменяются при загрузке файлов модулей.
И конкретный спецификатор, который, я считаю, будет работать здесь, это %H
который предназначен для «имени хоста» и описывается как:
Имя хоста работающей системы в момент загрузки конфигурации устройства.
Так что, проверяя ваш пример сценария systemd
, измените ваш [Service]
чанк так:
[Service]
Type=simple
User=redmine
Group=redmine
ExecStart=/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -b %H -p 3000
Обратите внимание, что строка с назначением ip=()
пропала, и команда ExecStart
теперь использует %H
вместо $ip
.
Идея получения IP-адреса с помощью systemd
.
Тем не менее, похоже, что systemd
предоставляет имя хоста только через «спецификатор %H
». Что странно, если вы спросите меня. Так что, хотя у меня нет большого опыта работы с systemd
, я думаю, что понимаю, что можно сделать для достижения цели этого поста.
Ключ должен был бы установить EnvironmentFile
для чтения systemd
. Читайте о том, как использовать EnvironmentFile
здесь на этом сайте .
Допустим, вы создали простой скрипт Bash, подобный этому; давайте назовем его write_ip_to_file.sh
и не стесняемся изменять логику получения IP-адреса ip=$()
в соответствии с тем, что работает в вашей настройке:
#!/bin/bash
ip=$(/sbin/ifconfig eth0 | awk '/inet addr/ {split ($2,A,":"); print A[2]}');
echo IP=$ip > ~/ip.txt;
Все, что нужно сделать, это вывести IP-адрес eth0
в текстовый файл с именем ip.txt
в вашем домашнем каталоге. Формат будет примерно таким:
IP=123.456.789.0
Понял? Хорошо. Теперь в вашем сценарии systemd
измените ваш [Service]
чанк на что-то вроде этого; не забудьте установить [your username]
в соответствии с именем пользователя каталога, в котором сохранен ip.txt
:
[Service]
Type=simple
User=redmine
Group=redmine
EnvironmentFile=/home/[your username]/ip.txt
ExecStart=/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -b $IP -p 3000
И что это будет делать, это загрузить конфигурацию в ip.txt
и назначить $IP
значение 123.456.789.0
. Я считаю, что это то, что вы ищете.
Ключевым фактором здесь является заставить write_ip_to_file.sh
запускаться при загрузке или, возможно, даже самим сценарием systemd
.
Еще одна идея для получения IP-адреса с помощью systemd
.
Но с учетом сказанного, у меня есть идея получше (если она работает): переместите всю эту команду ExecStart
в файл Bash с именем redmine_start.sh
и убедитесь, что система может прочитать и выполнить ее. Содержимое redmine_start.sh
будет следующим: не стесняйтесь изменять логику выборки IP-адреса ip=$()
в соответствии с тем, что работает в вашей настройке:
#!/bin/bash
ip=$(/sbin/ifconfig eth0 | awk '/inet addr/ {split ($2,A,":"); print A[2]}');
/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -b $IP -p 3000
А затем измените свой [Service]
чанк на что-то вроде этого; не забудьте установить [your username]
в соответствии с именем пользователя каталога, в котором сохранен redmine_start.sh
:
[Service]
Type=simple
User=redmine
Group=redmine
ExecStart=/home/[your username]/redmine_start.sh
Если вы следуете логике, если вся логика ExecStart
содержится в redmine_start.sh
вы можете использовать этот трюк Bash для получения IP-адреса, назначить его переменной и запустить там Redmine. Сценарий systemd
будет просто управлять тем, когда / как начать это.
Получение IP-адреса машины с помощью init.d
И для справки пользователей init.d
я использую Ubuntu, и когда мне нужно получить текущий IP-адрес рабочей системы в скрипте запуска Bash или init.d
я запускаю что-то вроде этого:
ip=$(/sbin/ifconfig eth0 | awk '/inet addr/ {split ($2,A,":"); print A[2]}')
Конечно, вам нужно изменить /sbin/ifconfig
чтобы он соответствовал расположению ifconfig
в вашей системе, а затем также изменить eth0
чтобы соответствовать сетевому интерфейсу, для которого вы хотите получить IP-адрес.
Но однажды настроенный в соответствии с вашими настройками и потребностями, он успешно получает IP-адрес интерфейса и назначает его переменной ip
которой затем можно получить доступ как $ip
в вашем скрипте.