web-dev-qa-db-ja.com

Python)で記述されたinit.dスクリプト

A StackOverflowで質問がありました 書き込みについて尋ねるinit.dPythonのスクリプト。あるコメントは、これらのスクリプトはPythonではなくシェルでプログラムする必要があることを示しています。書いています init.d Pythonのスクリプト:

  1. 悪い。悪い。悪い。これは絶対にしないでください。
  2. 推奨される方法ではありません。
  3. はい、注意が必要です。
  4. レガシードグマ。
  5. まったく問題ありません。

悪夢のシナリオを知っているか、このルールがシステム管理者の血で書かれている場合は素晴らしいでしょう。

10
mjhm

私は#2と言いますが、#1に非常に近いです-「悪い。悪い。悪い。これは絶対にしないでください。」 Linux initスクリプトの標準は LSB内 であり、「これらはボーンシェルスクリプトです」と表示されることはありませんが、いくつかの仮定があります。 1つは、#で始まる行がコメントであるということですが、たまたまうまくいきます。さらに問題なのは、initスクリプトが「現在の環境で/lib/lsb/init-functionsからコマンドを実行する(シェルの特別な組み込みコマンドドットを参照)」という要件です。

しかし、もっと重要なことは、ここで本当に複雑なことをしているのなら、それは間違っているということです。 initスクリプトは、非常にシンプルで実用的である必要があります。プログラムではなく、古典的な意味でのスクリプトである必要があります。 Pythonで美しく設計されたものを作成するよりも、それを吸い上げて、システム管理者が1回のクイックルックで簡単に理解できる単純なシェルスクリプトを作成することをお勧めします。

覚えておくべきもう1つの考慮事項は、 systemd です。これは、Linuxでのすべてのシステム初期化の将来である場合とそうでない場合があります。 systemdでは、初期化はスクリプトではなく単純な構成ファイルによって行われます。すべてのスタートアップはいくつかの標準的なデザインパターンに適合し、実際には1つを選択するだけで済みます。プログラムが初期化に複雑なものを使用する場合、それはinitスクリプト自体の外にあるはずです。

9
mattdm

確かに、init.dスクリプトの実行中にPythonインタープリターが使用可能になることを知っていれば、問題はありません。これは、私にとっては、マルチユーザー(または「グラフィックコンソール」)の実行レベルで比較的遅く行われていることを見ています。

ただし...これは、Pythonインタープリターの特定のバージョンがブートシーケンスに不可欠である可能性があることを意味します。これは、アップグレード時に確認する必要があるもう1つのことです。

これは、「3。OK、警告あり」と言っていることを意味していると思います。

10
Vatine

私は「3.OK、警告あり」に同意しますが、理由は異なります。 Solarisでの私の経験では、内部プログラムの一部にPerlのOSコピーがありました。シェルスクリプトは、Perlを起動させるためのシェルにすぎませんでした。スタートアップスクリプトはshで書く必要がありましたか?いいえ。ただし、管理者の保守性が向上しました。そして、initスクリプトは、daemon --startdaemon --stopのようなものほど複雑なことは何もしませんでした。これを行った場合、プログラムのコンテキストで意味がある場合は、通常のユーザーが非特権モードでツールを起動できます。そして、彼らは精巧にするためにあらゆる種類の複雑な設定をする必要はありません。

最新のLinuxディストリビューションには、まだinit.dを使用しているものも含めて、デーモンの管理を容易にすることを目的としたビルド済み関数の大規模なコレクションがあります。グラフィカルブートプロセスは、これらの機能を定期的に活用して、起動スクリプトの1つがエラーを吐き出し始めない限り、きれいなロゴを維持します。あなたのPythonコード(または他の言語)はこれらのスキームではうまく機能しないかもしれません。

美学や保守性を気にしない場合は、initスクリプトを好きなように書くことができます。適切にカットアンドペーストすることさえできない多くの管理者が、コマンドライン引数を完全に無視し、デーモンを起動するだけであるのを見てきました。シャットダウン、ステータス、または再起動はありません。それは未熟でしたが、彼らのコードはまだ実行されていました。

2
zerolagtime

私は#1-2の間で言います。 LSBはあなたにこのように指示します..そしてSys-Admin(非開発者の役割)から、ジョブ要求はPythonの開発者レベル(または軽い理解)ではなく、sh/bashの知識を指示しますPHP =またはPerl。これはLAMPスタック用であり、システム初期化スクリプト用ではありません。

1
Tweeks