私のスクリプトを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
:スクリプトが実行可能でない場合、このサービスは無害にスキップされます。Wants
とAfter
:ネットワークインターフェースが有効になった後に実行するサービスを設定する方法man systemd.special
。を参照してください。Type=oneshot
:何も実行されず、スクリプトが終了するからです。これがなければ、systemdはType=simple
スクリプトの終了が失敗したことを意味すると仮定します。RemainAfterExit=true
:システムはサービスが一度実行されたことを「記憶」し、スクリプトが終了しても「アクティブ」とマークします。ExecStart
:実行する実際のコマンド/スクリプトを指定します。WantedBy=multi-user.target
:サービスが通常の起動プロセスに追加されます。