web-dev-qa-db-ja.com

起動/起動時にスクリプトを実行します。 init.d対cron @reboot

現在、システムの起動/起動時にスクリプトを実行するためのinit.dとcron @rebootの違いを理解しようとしています。

@reboot(このメソッドは this forumhs.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ファイルを組み込みます。

52
3kstc

init.dはSysVスクリプトとも呼ばれ、システムの初期化およびシャットダウン中にサービスを開始および停止するためのものです。 (/etc/init.d/スクリプトは、互換性のためにsystemd対応システムでも実行されます)。

  • スクリプトは、起動時およびシャットダウン時に実行されます(デフォルト)。
  • スクリプトは、単なるスクリプトではなく、init.dスクリプトである必要があります。 startstopなどをサポートする必要があります( Debianポリシー を参照)
  • スクリプトはシステムブート中に実行できます(いつ定義できるか)。

crontab(したがって@reboot)。

  • cronは通常のコマンドやスクリプトを実行しますが、ここでは特別なことは何もしません。
  • すべてのユーザーが@rebootスクリプトを追加できます(rootだけではありません)
  • systemdを使用するDebianシステムの場合:cronの@rebootはmulti-user.targetの間に実行されます。
  • sysV(systemdではない)を使用するDebianシステムでは、crontab(5)は次のように述べています。@ rebootに関する限り、起動はcron(8)デーモンが起動するときであることに注意してください。特に、一部のシステムデーモンまたはその他の機能が起動する前である可能性があります。これは、マシンのブート順序シーケンスが原因です。
  • 起動時と定期的に同じスクリプトをスケジュールするのは簡単です。

/etc/rc.localは多くの場合、醜いか、または非推奨であると考えられています(少なくとも redhat によって)、それでも多少のニースはありました特徴:

  • rc.localは通常のコマンドやスクリプトを実行しますが、ここでは特別なことは何もしません。
  • sysV(systemdではない)を使用するDebianシステムの場合:rc.localが(ほぼ)開始する最後のサービスでした。
  • しかし、systemdを使用するDebianシステムでは、デフォルトではrc.localの後にnetwork.targetが実行されます(network-online.targetではありません!)

Systemdのnetwork.targetおよびnetwork-online.targetについては、 ネットワークが稼働した後にサービスを実行する を参照してください。

39
Franklin Piat

まず、説明が適切です。

  • init.dは、サービス制御スクリプトを格納するディレクトリであり、httpdcronなどのサービスの開始と停止を制御します。
  • rc.localは、システム起動プロセスの一部として任意のスクリプトの実行を許可するサービスです

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として呼び出されている場合は、スクリプトの実行に関する条件。

12
wraeth

以下に私の回答を書いています。

Q1:2つの主な違いは何ですか?

上記の他のユーザーが述べた違いとは別に、@ rebootがcrondデーモンに依存している点を強調したいと思います。 crondが開始する順序によって異なります。ほとんどの場合、crondは正常に起動しますが、起動に失敗することがあります(少なくとも、一部のプロジェクトでいくつかの障害が発生しています)。 initスクリプトを作成するとき、スクリプトで何か悪いことをすると失敗が発生します(例:サービスの後に開始されるサービスに依存している)

Q2:どちらがより堅牢ですか?

上記に基づいて、私はinitがより堅牢であると思います。しかし、最初の回答で「フランクリンピアト」が言及したように、別のポイントがあります。通常、デーモンにはinitスクリプトが必要であり、ポリシーに従う必要があります

Q3:2つのうちより良いものはありますか?

私はそうは思いません(rc.localは少し古く、非推奨です)

Q4:これは、起動中に実行するスクリプトを埋め込む正しい方法ですか?

はい。通常、アプリケーション/パッケージの作成者はこの方法で行います。

3
shubham