Makine IP adresinin “sistem” servis dosyasında nasıl alınacağı


9

Makinenin IP'sini almalı ve hizmetimde kullanmalıyım:

[Unit]
Description=Redmine server
After=syslog.target
After=network.target

[Service]
Type=simple
User=redmine
Group=redmine
ip="$(/sbin/ip -o -4 addr list eno16777736 | awk '{print $4}' | cut -d/ -f1)"
ExecStart=/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -b $ip -p 3000

# Give a reasonable amount of time for the server to start up/shut down
TimeoutSec=300

[Install]
WantedBy=multi-user.target

Bu komutu systemdservis dosyası içinde nasıl çalıştırabilirim ve sonucunu nasıl alabilirim :

ip=$(/sbin/ip -o -4 addr list eno16777736 | awk '{print $4}' | cut -d/ -f1)

sonucunu kullanmak için, bunun xxx.xxx.xxx.xxxgibi sth:

ExecStart=/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -p 3000 -b $ip

Yanıtlar:


9

Makine ana makine adı ile alınıyor systemd.

Bu kılavuzun yanı sıra resmi man sayfalarına da systemdbakarken çok aşina olmama rağmen , aradığınız şey “belirleyici” bir değer:systemd

Birçok ayar, birim dosyaları yüklendiğinde değiştirilen çalışma zamanı veya birim parametrelerine atıfta bulunan genel birim dosyalarını yazmak için kullanılabilecek özellikleri giderir.

Ve burada çalışacağına inandığım belirli belirleyici %H, “Ana bilgisayar adı” için olan ve şöyle tanımlanır:

Çalışan sistemin ana makine adı, birim yapılandırmasının yüklendiği zamandaki noktada.

Bu yüzden, örnek systemdbetiğinizi kontrol ederek, [Service]öbeğinizi şu şekilde değiştirin :

[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=()Atama ile satırın gittiğini ve ExecStartkomutun %Hbunun yerine artık kullandığını unutmayın $ip.

IP adresi almak için bir fikir systemd.

Bununla birlikte, systemdsadece %H“ şartname ” üzerinden bir ana bilgisayar adı sağladığı görülüyor . Bana sorarsanız garip. Dolayısıyla derin bir deneyime sahip systemdolmasam da, bu yazının amacına ulaşmak için neler yapılabileceğini anladığımı düşünüyorum.

Anahtar, okumak için bir kurulum EnvironmentFileyapmak systemdolacaktır. Bu sitede nasıl kullanılacağı hakkında daha EnvironmentFilefazla bilgi edinin .

Diyelim ki böyle basit bir Bash betiği yarattınız; adlandıralım write_ip_to_file.shve ip=$()kurulumunuzda işe yarayanla eşleşmesi için IP adresini alma mantığını değiştirmekten çekinmeyin :

#!/bin/bash
ip=$(/sbin/ifconfig eth0 | awk '/inet addr/ {split ($2,A,":"); print A[2]}');
echo IP=$ip > ~/ip.txt;

Tek yapması gereken, IP adresinizi giriş dizininizdeki eth0bir metin dosyasına vermektir ip.txt. Format böyle bir şey olurdu:

IP=123.456.789.0

Anladım? İyi. Şimdi systemdbetiğinde, [Service]öbürünü böyle bir şey olacak şekilde değiştir ; kaydedildiği [your username]dizinin kullanıcı adıyla eşleşecek şekilde ayarlamayı unutmayın 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

Ve bunun yapması gereken, config dosyasını yüklemek ip.txtve $IPdeğerini vermektir 123.456.789.0. Aradığın şeyin bu olduğuna inanıyorum.

Buradaki kilit faktör write_ip_to_file.sh, açılışta veya belki de systemdbetiğin kendisi tarafından çalıştırılmaktır .

IP adresi almak için başka bir fikir systemd.

Ancak bununla birlikte, daha iyi bir fikrim var (eğer işe yararsa): Tüm ExecStartkomutu, adı verilen Bash dosyasına taşıyın redmine_start.shve sistemin onu okuyabildiğinden ve çalıştırabildiğinden emin olun. İçeriği redmine_start.shşöyle olacaktır; IP adresi alma mantığını, ip=$()kurulumunuzdakilerle eşleşecek şekilde eşleştirmekten çekinmeyin :

#!/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

Ve sonra [Service]yığınını böyle bir şey olacak şekilde değiştir ; kaydedildiği [your username]dizinin kullanıcı adıyla eşleşecek şekilde ayarlamayı unutmayın redmine_start.sh:

[Service]
Type=simple
User=redmine
Group=redmine
ExecStart=/home/[your username]/redmine_start.sh

Eğer mantığı izlerseniz, mantığının tamamı ExecStartiçeriyorsa redmine_start.sh, IP adresini almak için bu Bash numarasını kullanabilirsiniz, onu bir değişkene atayın ve sonra Redmine'yi orada başlatın. systemdO nasıl başlayacağınızı zaman / script sadece yönetmek olacaktır.

Makinenin IP adresini alınıyor init.d.

Ve init.dkullanıcıların referansı için Ubuntu kullanıyorum ve mevcut bir çalışma sistemi IP adresini bir Bash ya da init.dbaşlangıç ​​komut dosyasında almam gerektiğinde şöyle bir şey çalıştırıyorum:

ip=$(/sbin/ifconfig eth0 | awk '/inet addr/ {split ($2,A,":"); print A[2]}')

Tabii ki , sisteminizin /sbin/ifconfigkonumunu eşleştirmeniz ifconfigve ardından eth0IP adresini almak istediğiniz ağ arabirimiyle eşleştirmeniz için değiştirmeniz gerekir.

Ancak kurulumunuz ve gereksinimlerinize uyacak şekilde ayarlandıktan sonra, bu, bir arayüzün IP adresini başarıyla alır ve ipdaha sonra $ipbetiğinizdeki gibi erişilebilen değişkene atar .


1
Bu normal bir senaryo için. Ama benim sorum, o arayüzün mevcut IP adresini sağlamak için bir sth.service dosyasında nasıl yapılacağıydı.
elekgeek

@elekgeek Oluşturduğum birkaç init.dbaşlangıç ​​servis betiğinde aynı tam formatı kullanıyorum ve sözdizimi / format iyi çalışıyor.
JakeGould

1
fakat bu işe yaramıyor, ilk
mesajdaki

1
btw, bu bir hizmet ve durumu görüntülediğimde $
ip'in

@elekgeek Son düzenlememi kontrol et. Bazı kazılar yaptım ve systemddeğişkenlerin nasıl ele alındığı hakkında biraz bilgi buldum ; Onlara "belirtici" diyorlar.
JakeGould

6

Belki bu inşaat işe yarar. Dene:

[Service]
Type=simple
User=redmine
Group=redmine
PermissionsStartOnly=true
ExecStartPre=/bin/bash -c "/bin/systemctl set-environment ip=$(/sbin/ip -o -4 addr list eno16777736 | awk '{print $4}' | cut -d/ -f1)"
ExecStart=/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -b ${ip} -p 3000

Çalışma onaylandısystemd 228
mleu

Teşekkürler. ÇALIŞIYOR bir cazibe gibi.
Stelios

5

Ana bilgisayar IP adreslerini kullanın ve EnvironmentFile

Kur-ağ-ortam yardımcı programını /etc/network-environmentkullanarak ana bilgisayar IP adreslerinizi dosyaya yazabilirsiniz . Sonra uygulamanızı aşağıdaki şekilde çalıştırabilirsiniz:

[Unit]
Requires=setup-network-environment.service
After=setup-network-environment.service

[Service]
EnvironmentFile=/etc/network-environment
ExecStart=/opt/bin/kubelet --hostname_override=${DEFAULT_IPV4}

Kaynak: https://coreos.com/os/docs/latest/using-environment-variables-in-systemd-units.html

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.