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


48

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

使用@reboot(このメソッドはで言及されたこのフォーラムによるhs.chandraは)単純に行くことによって、いくつかの何が簡単ですcrontab -eし、作成し@reboot /some_directory/to_your/script/your_script.txtた後、your_script.txtシステムが再起動されるたびに実行されなければなりません。詳細な説明@rebootこちら

または、スクリプトの2行目に埋め込むこと/etc/init.d/your_script.txtにより、のようにします。

#!/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ファイルを組み込みます。


2
また、関連するが、systemdにされたリンク1 リンク2
ルーファス

回答:


37

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

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

crontab(したがって@reboot)。

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

/etc/rc.local多くの場合、by いまたは非推奨(少なくともredhatによって)であると見なされますが、まだいくつかの優れた機能があります。

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

systemdにさんについてnetwork.targetnetwork-online.target、読んネットワークがアップした後、実行中のサービスを


Ununtu 16.04では、システムを/var/run/crond.reboot起動するたびに@reboot cronジョブが実行されるようにする場合は、毎回ファイルを削除する必要があります。このファイルが存在する場合、@ reboot cronジョブは実行されません
アルバートカタラ

@ Albert-CatalaはUbuntuにバグを提出します!
フランクリンピアト

12

まず、明確化が順番に行われます。

  • init.dディレクトリはディレクトリである店舗のサービスを制御するスクリプトを制御することを開始し、そのようなサービスの停止httpdまたはcron
  • rc.localは、システムの起動プロセスの一部として任意のスクリプトを実行できるサービスです

その優れた使用するかどうかという点でrc.localまたはcronスクリプトを実行するために、私はそれが美学の問題より実用性を超えていると思われます。cron、タスクスケジューラとして、更新の確認、キャッシュのクリーニング、セキュリティ監査の実行など、マシンのメンテナンスまたは維持を実行する方法を目的としています。これは、指定された時間(など@reboot)に必要なスクリプトまたはコマンドを実行できるため、これらの機能の実行に限定されることを意味しません。

rc.local一方、を使用すると、システム構成タイプのタスク内に収まります。これはrc.local、マシンのinitシステムによって実行されるため、通常、マシンのネットワーク構成、サービス、または環境の設定を担当します(ただし、この仕事)。

ただし、これらのポイントは両方とも、すべてのinitシステムがrc.localメカニズムを提供するわけではなく、すべてのcronデーモンが@reboot疑似タグを提供するわけではないという事実によって緩和する必要があります。

ボーナスポイント

前述したように、init.dシステム上で(少なくともSysVinitシステムを使用するマシン上で)開始または停止できるサービスを制御するスクリプトを含むディレクトリです。initシステムとスクリプトの目的によっては、スクリプトをinitスクリプトに変換して、サービスと同じ方法で実行するのが妥当な場合があります。ただし、これらのファイルの構築方法を取り巻くフレームワークは大きく異なる可能性があるため、これはinitシステムに大きく依存しています。

最後の言葉

また、通常bashスクリプトは、ファイルがテキストファイルではなくシェルスクリプトであることを即座に示すため、末尾がで.shなくであることに注意してください.txt。つまり、ファイルの先頭にシェバン#!/bin/bash)が付いているか、またはと呼ばれているbash /path/to/script.whatever場合、スクリプトの実行に関しては問題ではありません。


bash通常、スクリプトは拡張子で終了しません(おそらくそうすべきではありません)sh
mikeserv

1
@mikeserv:ほとんどのbashスクリプトには拡張子が付いていないことに同意しますが、拡張子が「.sh」のファイルは通常bashスクリプトです。「。shファイルと」を参照してください
デビッドケーリー

@DavidCary-それは非常に信頼できるソースのようには見えません。
mikeserv

1
ウィキペディア:「ファイル名拡張子のリスト」およびウィキペディア:「シェルスクリプト」では、驚くほど一般的な「.sh」拡張子についても言及しています。
デビッドケーリー

1
通常、bashスクリプト.sh.txt「」ではなく接尾辞で終わりshます。具体的には、bashスクリプト(または他のシェルスクリプト)のファイル名拡張子として、txt通常プレーンテキストを示すよりも意味が正確です。あなたがクスクス笑いをさせる拡張機能なら何でも使用できますが、拡張機能の使用shがより適切で一般的に使用されている場合、一般的な慣例があります。必須ではありませんが、特にから実行されることを意図したスクリプトの場合はPATH
wraeth

3

私は以下に答えを書いています。

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

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

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

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

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

私はそうは思いません(rc.localは少し古く、廃止予定です)

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.