Pythonで書かれたinit.dスクリプト


10

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

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

悪夢のようなシナリオを知っているか、このルールが一部のシステム管理者の血に書かれているかどうかは、素晴らしいことです。

回答:


9

私は#2と言いますが、#1に非常に近い-「悪い。悪い。悪い。これを決してしないでください。」Linuxの初期化スクリプトのような標準はLSBにあり、それが出てくることは決してなく、「これらはボーンシェルスクリプトである」と言っていますが、いくつかの仮定が行われています。1つは、#で始まる行がコメントであることです。さらに問題なのは、initスクリプトが/lib/lsb/init-functions「現在の環境(シェルの特殊な組み込みコマンドドットを参照)」からコマンドを実行する必要があるということです。

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

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


1
この答えでいきます。重要なのは、Pythonは必要ではなく、標準的でもないため、デバッグの不確実性の追加ポイントと障害の追加ポイントを作成する可能性があるということです。元のSOの質問を参照して、そのようなスクリプトがデーモンを起動できることを収集しましたが、実際のデーモンではないはずです。
mjhm 2010

覚えていれば、すべてのディストリビューションがLSBをフォローしているわけではありません。debianを参照してください。
マッシモ

10

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

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

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


4
+1。まさに私が書いていたもの。ここでの唯一の「問題」は、LSBに準拠していること(たとえば、必要な関数を提供していること)と、必要なpythonインタープリターが実行時に利用可能であること(そして壊れていないこと)を確認することです
Sam Halicke

3
ユーザーが/ usrを別のパーティションに置くことを選択した場合、実行時に使用可能になるのは複雑になる可能性があります。Pythonは通常/ usrにインストールされるため、スクリプトは/ usrがマウントされた後に実行することが重要です。
Zoredache 2010年

@Zoredache-Ayup。通常、「マルチユーザー」のRCシーケンスに遅れたときに「発生した」ことを知っています。
Vatine

2

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

最近のLinuxディストリビューションは、まだを使用しているディストリビューションであってもinit.d、デーモンの管理を容易にするためにあらかじめ構築された関数の大規模なコレクションを備えています。グラフィカルブートプロセスは、起動スクリプトの1つがエラーを吐き出さない限り、これらの機能を日常的に利用して、きれいなロゴを維持します。Pythonコード(またはその他の言語)は、これらのスキームではうまく機能しない可能性があります。

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


1

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

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