Obtendo o nome do host da máquina com systemd .
Embora eu não esteja profundamente familiarizado com systemd olhando este site tutorial , bem como o official systemd man pages , o que você parece estar procurando é um valor de "especificador":
Many settings resolve specifiers which may be used to write generic unit files referring to runtime or unit parameters that are replaced when the unit files are loaded.
E o especificador específico que acredito funcionaria aqui é %H , que é para "Nome do host" e é descrito como:
The hostname of the running system at the point in time the unit configuration is loaded.
Então, verificando o script systemd do seu exemplo, altere o seu [Service] chunk para isso:
[Service]
Type=simple
User=redmine
Group=redmine
ExecStart=/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -b %H -p 3000
Observe que a linha com a atribuição ip=() desapareceu e o comando ExecStart agora usa %H em vez de $ip .
Uma ideia para obter um endereço IP com systemd .
Dito isso, parece que systemd fornece apenas um nome de host por meio do especificador %H ". O que é estranho se você me perguntar. Então, embora eu não tenha uma experiência profunda com systemd , acredito que entendo o que poderia ser feito para atingir o objetivo deste post.
A chave seria configurar EnvironmentFile para systemd para ler. Leia sobre como usar um EnvironmentFile aqui neste site .
Então, digamos que você criou um script Bash simples como este; Vamos citar write_ip_to_file.sh e sinta-se à vontade para alterar a lógica de busca do endereço IP de ip=$() para corresponder ao que funciona na sua configuração:
#!/bin/bash
ip=$(/sbin/ifconfig eth0 | awk '/inet addr/ {split ($2,A,":"); print A[2]}');
echo IP=$ip > ~/ip.txt;
Tudo o que é necessário é enviar o endereço IP de eth0 para um arquivo de texto chamado ip.txt em seu diretório pessoal. O formato seria algo assim:
IP=123.456.789.0
Entendeu? Boa. Agora, no seu script systemd , altere seu [Service] para ser algo assim; não se esqueça de definir [your username] para corresponder ao nome de usuário do diretório em que ip.txt foi salvo:
[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
E o que isso faria é carregar a configuração em ip.txt e atribuir $IP o valor de 123.456.789.0 . Eu acredito que é isso que você está procurando.
O fator chave aqui é fazer com que write_ip_to_file.sh seja executado na inicialização ou talvez até mesmo pelo próprio script systemd .
Outra ideia para obter um endereço IP com systemd .
Mas com isto dito, eu tenho uma idéia melhor (se funciona): Mova todo o comando ExecStart para o arquivo Bash chamado redmine_start.sh e certifique-se de que o sistema possa lê-lo e executá-lo. O conteúdo de redmine_start.sh seria o seguinte; sinta-se à vontade para alterar a lógica de busca do endereço IP de ip=$() para corresponder ao que funciona na sua configuração:
#!/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
Em seguida, altere seu bloco [Service] para algo assim; não se esqueça de definir [your username] para corresponder ao nome de usuário do diretório em que redmine_start.sh foi salvo:
[Service]
Type=simple
User=redmine
Group=redmine
ExecStart=/home/[your username]/redmine_start.sh
Se você seguir a lógica, se toda a lógica de ExecStart estiver contida em redmine_start.sh , então você pode usar esse truque Bash para obter o endereço IP, atribuí-lo a uma variável e, em seguida, iniciar o Redmine. O script systemd estaria apenas gerenciando quando / como começar isso.
Obtendo o endereço IP da máquina com init.d .
E para a referência de init.d usuários, eu uso o Ubuntu e quando eu preciso pegar um endereço IP atual do sistema de trabalho em um Bash ou um script de inicialização init.d eu executo algo assim:
ip=$(/sbin/ifconfig eth0 | awk '/inet addr/ {split ($2,A,":"); print A[2]}')
É claro que você precisa alterar /sbin/ifconfig para corresponder à localização de ifconfig em seu sistema e também alterar eth0 para corresponder à interface de rede da qual deseja obter o endereço IP.
Mas, uma vez ajustado para corresponder à sua configuração e às necessidades, obtém-se com êxito o endereço IP de uma interface e atribui-o à variável ip , que pode ser acessada como $ip em seu script.