Udało mi się to zrobić w Ubuntu, edytując plik:
/etc/rc.local
i dodaj:
IP=$(/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}')
echo "IP: $IP" > /etc/issue
W Arch ten plik nie istnieje „/etc/rc.local”, a po przeszukaniu znalazłem, że muszę utworzyć ten plik:
/etc/systemd/system/rc-local.service
Zawartość:
[Unit]
Description=/etc/rc.local compatibility
[Service]
Type=oneshot
ExecStart=/etc/rc.local
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
Następnie utwórz „/etc/rc.local”.
Zawartość:
IP=$(/sbin/ip route get 1 | awk '{print $NF;exit}')
echo "IP: $IP" > /etc/issue
exit 0
Następnie spraw, aby był wykonywalny:
sudo chmod +x /etc/rc.local
I wreszcie rozpocznij / przetestuj:
sudo systemctl start rc-local.service
Błąd:
Job for rc-local.service failed because the control process exited with error code.
See "systemctl status rc-local.service" and "journalctl -xe" for details.
Wyjście systemctl status rc-local.service
:
* rc-local.service - /etc/rc.local Compatibility
Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Fri 2016-06-10 02:52:17 AST; 1min 59s ago
Process: 760 ExecStart=/etc/rc.local (code=exited, status=203/EXEC)
Jun 10 02:52:17 maro systemd[1]: Starting /etc/rc.local Compatibility...
Jun 10 02:52:17 maro systemd[1]: rc-local.service: Control process exited, code=exited status=203
Jun 10 02:52:17 maro systemd[1]: Failed to start /etc/rc.local Compatibility.
Jun 10 02:52:17 maro systemd[1]: rc-local.service: Unit entered failed state.
Jun 10 02:52:17 maro systemd[1]: rc-local.service: Failed with result 'exit-code'.
Wyjście journalctl -xe
:
-- Unit rc-local.service has begun starting up.
Jun 10 02:52:17 maro systemd[760]: rc-local.service: Failed at step EXEC spawning /etc/rc.local: Exec format error
-- Subject: Process /etc/rc.local could not be executed
-- Defined-By: systemd
Aktualizacja:
- Dodany
#!/bin/bash
do/etc/rc.local
sudo systemctl daemon-reload
sudo systemctl start rc-local.service
- Teraz nie dostaję żadnych błędów! ale:
sudo systemctl status rc-local.service
Wydajność:rc-local.service - /etc/rc.local Compatibility Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; vendor preset: disabled) Active: inactive (dead) since Fri 2016-06-10 13:13:04 AST; 3s ago Process: 488 ExecStart=/etc/rc.local (code=exited, status=0/SUCCESS)
Jun 10 13:13:04 maro systemd[1]: Starting /etc/rc.local Compatibility... Jun 10 13:13:04 maro systemd[1]: Started /etc/rc.local Compatibility.
Próbowano zrestartować komputer i przed zalogowaniem mówi:
rtnetlink answers network is unreachable
Na ekranie logowania: pokazuje „IP:” tylko bez pokazywania adresu IP komputera. Po zalogowaniu się i pingowaniu google na przykład internet działa bez problemu, a komputer jest dostępny za pośrednictwem sieci LAN.
sudo env -i /etc/rc.local
= Brak wyjściaip route get 1 | awk '{print $NF;exit}'
który jest używany w/etc/rc.local
= 192.168.0.103
Wyjście nav
:
XDG_SESSION_ID=c2
TERM=xterm
SHELL=/bin/bash
SSH_CLIENT=192.168.0.100 64436 22
SSH_TTY=/dev/pts/0
USER=maro
MAIL=/var/spool/mail/maro
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
PWD=/home/maro
LANG=C
SHLVL=1
HOME=/home/maro
LOGNAME=maro
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
SSH_CONNECTION=192.168.0.100 64436 192.168.0.103 22
XDG_RUNTIME_DIR=/run/user/1000
_=/usr/bin/env
Edytowane /etc/systemd/system/rc-local.service
:
Usunięto cztery ustawienia po wykonaniu ExecStart.
Próbowałem również zmienić: Type=forking
Stan nadal mówi: Active: inactive (dead)
źródło
Odpowiedzi:
Mam 99% pewności, że to dlatego, że nie wywołałeś interpretera w skrypcie.
/etc/rc.local :
To prawdopodobnie zadziała. Wiele osób jawnie wywołuje bash w swoich plikach systemowych; Zmodyfikowałem twój plik usługi. Wspominam o tym poniżej, ale 4 ustawienia są niepotrzebne (według mojej najlepszej wiedzy) i usunąłem je również tutaj:
/etc/systemd/system/rc-local.service :
Powinieneś również użyć pełnej ścieżki do awk, ale to byłby inny błąd - jeszcze nie poszedłeś tak daleko w skrypt.
Jeśli to nie rozwiąże problemu, będziesz musiał przejść przez każdy jego fragment i zobaczyć, co działa samodzielnie. Środowisko systemowe jest bardzo rzadkie (podobne do rzeczy uruchamianych z crona, ale mniej środowiska). Rzeczy które zawsze praca przestaje działać z powodu pewnych ustawień środowiskowych, które są zawsze ustawiane, więc zapominamy, że nawet trzeba ją ustawić. Spróbuj wyodrębnić problem związany z tym. Oto kilka kroków izolacji:
Wykonaj bezpośrednio (z sudo lub w powłoce roota dla każdego kroku)
/etc/rc.local
z terminala.Jeśli to działa, spróbuj wykonać go jako
env -i /etc/rc.local
Jeśli to nie zadziała, możesz próbować przekazywać wartości środowiskowe pojedynczo lub ustawić je jako „brutalne” (bardzo niechętne, ale gdybyś był tak skłonny, mógłbyś zrzucić wynikenv
w „normalnej” powłoceenv | sed 's/^/export /g' | sed 's/=/='/g' | sed -e 's/$/'/g' > env_values.sh
i jawnie ustaw te wartości w skrypcie. Musisz trochę przeskanować listę - będzie ona miała wartości połączenia ssh i inne wpisy sterowane zdarzeniami, które prawdopodobnie nic nie zepsują, ale zdecydowanie nie pomogą w anytowaniu).Jeśli nie jest tak, ponieważ bez względu na to, jak wykonasz rc.local, po prostu działa, usunąłbym twój systemowy plik usługi. Wypróbuj bez nich.
Spróbuj użyć @ Reboot cronjob . Bardzo podobne środowisko, ale uważam to za mniej „wybredne”. @reboot zastępuje zwykłą 5-gwiazdkową metodę pomiaru czasu (np. zamiast 0 0 0 * * po prostu umieszczasz @reboot), a Twój skrypt zostanie wywołany przy każdym uruchomieniu. Jeśli potrzebujesz dodatkowej pomocy przy zakładaniu cronjob, zdecydowanie mogę podać więcej szczegółów.
Nie ma nic złego w twojej metodzie uzyskiwania IP. Oto inna metoda wypróbowania, jeśli powoduje jakiekolwiek problemy. Twój jest prawdopodobnie lepszy. ma mniej zależności i na pewno czystsze, ale używam tego podejścia od lat bez problemu:
Jeśli to się nie powiedzie, będziesz musiał przeczytać dokumentację systemową ... która, jak się prawdopodobnie odkryłeś, jest bardzo długa w przeliczaniu na słowa i niewiarygodnie niska na konkretnych informacjach. Daj mi znać, co się dowiesz, nawet jeśli te pomysły nie działają - w wynikach mogą być wskazówki.
Aktualizacja
Zgodnie z Twoją aktualizacją zmiany w usłudze umożliwiają poprawne działanie skryptu. Status, który otrzymujesz, jest normalny w przypadku jednorazowych usług systemowych, które są naprawdę skupione wokół procesów demona, które są uruchamiane, a ty tego nie robisz - więc (upraszczając to bardzo) zasadniczo mówiąc, że jest nieaktywny, oznacza to po prostu skrypt nie jest jeszcze uruchomiony, nie jest zaplanowany do uruchomienia i nie pojawił się żaden proces, który śledzi system - wszystko jest poprawne i w porządku. Fakt, że pokazuje, że niedawno został uruchomiony i zakończony dzięki SUCCESS, oznacza, że działa.
Drugą kwestią jest czas względny. Krótka odpowiedź brzmi, że musisz zmienić plik usługi, dodając następujące dwa wpisy w [Jednostka]. To może po prostu praca . Jeśli nie, czytaj dalej.
Jest świetny artykuł na ten temat wymiana stosu Wydaje się, że zakryli każdy sposób, który może pójść źle, i sposób, w jaki może pójść dobrze w niewłaściwy sposób ... Nie będę się starał przekazać tego - po prostu wyślij to prosto od pozornego guru.
Alternatywne podejście, które ma tę zaletę, że rozzłości fanów systemowych
Jeśli takie podejście stanie się trudne lub niemożliwe z jakiegoś powodu, tutaj jest znacznie mniej elegancka metoda brutalnej siły, do której zwykle zwracam się, kiedy moja systemowa cierpliwość wypaliła się:
Możesz zmodyfikować skrypt, aby poczekał, aż adres IP stanie się dostępny, a nie zaplątuje się w problemy związane z czasem poprzedzającym. Jest to hack, ponieważ celowo wprowadzono nowe możliwości, które są wbudowane w systemd, ale to prawdopodobnie zrobiłbym.
Zaktualizowałem ten skrypt (próbowałem go uruchomić i znalazłem kilka problemów). Ten działa dobrze w moim systemie. Użyłem składni funkcji C na wywołaniu uśpienia i zapomniałem zwrócić coś z getIP; oba naprawione.
/etc/rc.local
I tak, używam tego regex $ iprgx cały czas - super pomocny.
źródło
[Unit]
rozwiązałem to! Wielkie dziękiNa CentOS 7 i Debian 8 (i może również inne), po prostu dodaj następującą linię do
/etc/issue
i to rozwiąże adres IPv4 maszyny. Jeśli masz wiele interfejsów sieciowych i chcesz wybrać jeden konkretny, możesz go określić
źródło