'ip address'コマンドは、Linuxのrc.localにIPアドレスを表示しません。

'ip address'コマンドは、Linuxのrc.localにIPアドレスを表示しません。

私のスクリプトをetc / rc.localファイルに追加して、コンピュータの起動時に自動的に起動するようにしたいと思います。私のスクリプトにはネットワーク条件が必要です。このスクリプトを実行すると、ネットワークがまだ準備されていないことがわかりました。私の考えでは、rc.localが遅く始まるかもしれませんが、ネットワークを準備する必要がありますか?それとも、この段階でネットワークが利用できないのが正常な場合は、スクリプトをどこに配置する必要がありますか?どんな意見でも歓迎します。

私のLinuxコンピュータがオンになっています。Linux localhost.localdomain 4.18.0-147.8.1.el8_1.x86_64

rc.localのコードスニペット: ip address>>/home/user/log.boot 2>&1

log.bootは次のようになります。

eno1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
 linker/ether xxxxxx brd ff:ff:ff:ff:ff:ff

答え1

私の記憶が正しければ、/etc/rc.localもう使われません。起動後にコマンドを実行する必要がある場合は、@reboot特別なフラグと一緒にcronを使用してください。

新しいファイルを作成し、/etc/cron.d/新しい行を追加します。

@reboot ip address >> /home/user/log.boot 2>&1

cronは次の起動時に実行されますip address >> /home/user/log.boot 2>&1

答え2

実行中のsystemdサービス/etc/rc.d/rc.local(RHEL / CentOS / UEL 8でシンボリックリンクされている/etc/rc.local)のデフォルト定義は次のとおりです。

[Unit]
Description=/etc/rc.d/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.d/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.d/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

指定された唯一の順序の依存関係はですAfter=network.target。これはあまり意味がありません。デフォルトで起動するとNetworkManager.service実行されますrsyslog.service。したがって、実際にはNetworkManagerがネットワークインタフェースを起動しようとしている間、通常は並列に実行されますが、これは特定の目的と比較して早すぎます。

これは、独自の最小限のシステムサービスを作成する良い例です。

まず、systemdExecStart=はシェルコマンドラインではありません。リダイレクトをサポートしていません。たとえば、コマンドの最小シェルスクリプトを作成し、/usr/local/bin/log-boot-ip.sh実行可能()としてマークしますchmod +x /usr/local/bin/log-boot-ip.sh

#!/bin/sh
ip address >> /home/user/log.boot 2>&1

次に、最小限の内容を作成してみましょう/etc/systemd/system/log-boot-ip.service

[Unit]
Description=log IP address(es) at each boot
ConditionFileIsExecutable=/usr/local/bin/log-boot-ip.sh
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/local/bin/log-boot-ip.sh

[Install]
WantedBy=multi-user.target

いつものように、systemdサービス定義を追加または変更し、そのsystemctl daemon-reload定義が実行さlog-boot-ip.serviceれたら実行します。

  • Description:人が読める短い説明

  • ConditionFileIsExecutable:スクリプトが実行可能でない場合、このサービスは無害にスキップされます。

  • WantsAfter:ネットワークインターフェースが有効になった後に実行するサービスを設定する方法man systemd.special。を参照してください。

  • Type=oneshot:何も実行されず、スクリプトが終了するからです。これがなければ、systemdはType=simpleスクリプトの終了が失敗したことを意味すると仮定します。

  • RemainAfterExit=true:システムはサービスが一度実行されたことを「記憶」し、スクリプトが終了しても「アクティブ」とマークします。

  • ExecStart:実行する実際のコマンド/スクリプトを指定します。

  • WantedBy=multi-user.target:サービスが通常の起動プロセスに追加されます。

関連情報