現在、システムの起動/起動時にスクリプトを実行するためのinit.d
とcron @reboot
の違いを理解しようとしています。
@reboot
(このメソッドは this forum でhs.chandraによって言及されました)の使用は、単にcrontab -e
および@reboot /some_directory/to_your/script/your_script.txt
の作成、次にyour_script.txt
は、システムが再起動されるたびに実行されます。 @reboot
の詳細な説明は ここ です。
または、/etc/init.d/your_script.txt
をスクリプトの2行目に埋め込むことにより、
#!/bin/bash
# /etc/init.d/your_script.txt
chmod +x /etc/init.d/your_script.txt
を実行すると、システムが起動するたびにyour_script.txt
も実行されます。
Q1:2つの主な違いは何ですか?
Q2:どちらがより堅牢ですか?
Q3:2つのうちより良いものはありますか?
Q4:これは、起動中に実行するスクリプトを埋め込む正しい方法ですか?
起動時に実行するbash .shファイルを組み込みます。
init.d
はSysVスクリプトとも呼ばれ、システムの初期化およびシャットダウン中にサービスを開始および停止するためのものです。 (/etc/init.d/
スクリプトは、互換性のためにsystemd対応システムでも実行されます)。
start
とstop
などをサポートする必要があります( Debianポリシー を参照)crontab
(したがって@reboot
)。
@reboot
スクリプトを追加できます(rootだけではありません)multi-user.target
の間に実行されます。/etc/rc.local
は多くの場合、醜いか、または非推奨であると考えられています(少なくとも redhat によって)、それでも多少のニースはありました特徴:
rc.local
が(ほぼ)開始する最後のサービスでした。rc.local
の後にnetwork.target
が実行されます(network-online.target
ではありません!)Systemdのnetwork.target
およびnetwork-online.target
については、 ネットワークが稼働した後にサービスを実行する を参照してください。
まず、説明が適切です。
httpd
やcron
などのサービスの開始と停止を制御します。rc.local
またはcron
を使用してスクリプトを実行する方が良いかどうかに関しては、実用性よりも美学の問題のほうが多いと思います。タスクスケジューラとしてのcron
は、更新のチェック、キャッシュのクリーンアップ、セキュリティ監査の実行など、マシンのメンテナンスまたは維持を実行する方法として意図されています。これは、指定された時間に必要な任意のスクリプトまたはコマンド(@reboot
など)を実行できるため、これらの機能の実行に限定されていることを意味しません。
一方、rc.local
を使用すると、システムの構成タイプのタスクに収まります。これは、rc.local
がマシンのinitシステムによって実行され、通常はマシンのネットワーク構成、サービス、または環境の設定を担当するためです(ただし、制限はありません)。このタスクにのみ)。
ただし、これらの両方の点は、すべてのinitシステムがrc.local
メカニズムを提供しているわけではなく、すべてのcronデーモンが@reboot
疑似タグを提供しているわけではないという事実によって緩和されるべきです。
前述したように、init.d
は、システム(少なくともSysV
タイプのinitシステムを使用するマシン)で開始または停止できるサービスを制御するスクリプトを含むディレクトリです。 initシステムとスクリプトの目的によっては、スクリプトをinitスクリプトに変換して、以下と同じ方法で実行するのが妥当な場合があります。サービス。ただし、これらのファイルの構築方法を取り巻くフレームワークは大きく異なる可能性があるため、これはinitシステムに大きく依存します。
また、通常、bashスクリプトは、.sh
ではなく.txt
のサフィックスで終わることに注意してください。これは、ファイルがテキストファイルではなくシェルスクリプトであることをすぐに示すためです。そうは言っても、ファイルの先頭にShebang(#!/bin/bash
)があるか、またはbash /path/to/script.whatever
として呼び出されている場合は、スクリプトの実行に関する条件。
以下に私の回答を書いています。
Q1:2つの主な違いは何ですか?
上記の他のユーザーが述べた違いとは別に、@ rebootがcrondデーモンに依存している点を強調したいと思います。 crondが開始する順序によって異なります。ほとんどの場合、crondは正常に起動しますが、起動に失敗することがあります(少なくとも、一部のプロジェクトでいくつかの障害が発生しています)。 initスクリプトを作成するとき、スクリプトで何か悪いことをすると失敗が発生します(例:サービスの後に開始されるサービスに依存している)
Q2:どちらがより堅牢ですか?
上記に基づいて、私はinitがより堅牢であると思います。しかし、最初の回答で「フランクリンピアト」が言及したように、別のポイントがあります。通常、デーモンにはinitスクリプトが必要であり、ポリシーに従う必要があります
Q3:2つのうちより良いものはありますか?
私はそうは思いません(rc.localは少し古く、非推奨です)
Q4:これは、起動中に実行するスクリプトを埋め込む正しい方法ですか?
はい。通常、アプリケーション/パッケージの作成者はこの方法で行います。