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.