web-dev-qa-db-ja.com

Linuxでサービスを開始および停止する標準的な方法はありますか?

最近まで、サービスを開始/停止/再開するためのシンプルで効果的な方法がありました。

service nginx start|stop|restart

これは何年もの間完璧に機能しました...いくつかのスマートパンツがそれらを改善することを決定するまで、今私はserviceスクリプトが何もしないDebian/Ubuntuシステムに直面しています(私はものを使用するはずなので)お気に入り systemctl start nginx.service(はるかに長く、オートコンプリートが機能しないなど...)

私の質問は、特にDebianとUbuntuについて言及していますが、CentOS/RedHatディストリビューションについても説明すると役立ちます。

それで、この運命の変化から私を救うことができる何かがありますか?

はっきりしない場合は、Debian 7.x、8.x、最新のUbuntu LTSおよび非LTSで動作する、それらに対処する一貫した方法を探しています。

PS。この特定の質問の範囲外ですが、ソリューションがサービスの有効化と無効化の部分もカバーする場合、追加の賞賛が与えられます。

15
sorin

複雑な歴史の中で、Unixプラットフォーム全体でさまざまなブートおよびサービス制御システムが数多くあります。

service\chkconfigベースのシステムシンプルで効果的なは、一般に SysVinit スタイルと呼ばれ、ある種の標準化への道のりの主要なステップでした。このスタイルのブートは、RHEL/CentOS(EL)から6リリースまで、Fedoraから14まで、およびDebian/Ubuntuベースのディストリビューションで2015年まで見られます。 initシステムにはまだ多くのファンがあります。

SysVinitは完全なソリューションではなく(何ですか?)、 Systemd は多くの問題を克服するために考案されました。これは、現在経験しているsystemctlコマンドベースのシステムです。それは普遍的に好まれるわけではありませんが(人々の憎悪の変化、膨満感など)、ほとんどのディストリビューションで急速に事実上の標準になっていることは間違いありません。

したがって、元の質問への回答をすぐに先に見ることは簡単です。
標準Linuxディストリビューション全体でサービスを制御するほとんど方法が今ではsystemctl
これが成り立つ期間は誰でも推測できます。たぶん何かが起こるまではbetterで広く採用されるようになるでしょう。

きっと許可できるラッパーがあると思います。あなたの現在のお気に入りはservice/chkconfigコマンドは、ほとんどが健全なことを続けますが、この特定の学習曲線では、おそらくそれと戦わないのが最善です。たぶん楽しみにしているかもしれませんが、しばらくの間、古いシステム用のsystemctlラッパーも存在し、より新しいものと一緒にそれらを管理することで苦痛を減らすことができます;)

6
DanSut

古いserviceコマンドを、代わりにservicectl [sic]を呼び出すラッパーで置き換えるのは意味がないのでしょうか?

はい、ただし[…]ラッパーで処理できるため、systemdへの移行がユーザーにとってスムーズになります。

…つまり、他の人がコメントで述べたように、以来ずっと行われてきたこと

Debian 8の/usr/sbin/serviceコマンドは、sysvinit-utilsパッケージの一部です。それは2009年から存在しています。これは、元のsysvinitソースパッケージへのDebian固有のRedHat由来の追加であり、スクリプトを読むとわかるように、systemdの実行とupstartジョブの存在の両方を認識し、systemctlおよびinitctl(エイリアスを介して)それぞれ。これは2013年以来行われています。

service nameactionは、Linux以外のオペレーティングシステムでもかなり広く利用できます。独自のserviceコマンドがあるため、ほとんどのBSDでも動作します。 noshパッケージには、system-control actionnameに変換されるshim serviceコマンドもあります。だが …

  • …この一般的なサブセットを超えると、互換性がずっと低くなります。
  • …OpenBSDにはserviceコマンドがありません。
  • …BSDのserviceコマンドには、システム管理者が何十年にもわたって戦争の物語を語ってきたという長年のよく知られた問題があります。

サービスの有効化と無効化は同様の状況です。 SuSE chkconfigプログラム(DebianおよびUbuntu用にパッケージ化されて入手可能)はFedoraのもの(それらはまったく異なるプログラミング言語で書かれていて、コンパイルされたものと解釈されたもの)とは非常に異なりますが、共通の最小限のものがありますchkconfig nameaction構文、actiononまたはoffです。だが …

  • …繰り返しますが、この一般的なサブセットを超えると、互換性が低下します。
  • …BSDにはchkconfigはありません。これは、従来のツールがsysrcまたは最新のOpenBSD rcctl enablercctl disableのいずれかであるためです。 noshパッケージにはchkconfigおよびrcctlシムがあり、これらはsystem-control enable nameおよびsystem-control disable nameに変換されます。
  • …Fedora chkconfigだけがsystemdを認識し、systemctl enableおよびsystemctl disableのシムとして機能します。 SuSE chkconfigはsystemdの知識がありません。

参考文献

5
JdeBP

Linuxでサービスを開始および停止する標準的な方法はありません。

この運命の変更から私を救うことができるものはありますか?

構成管理/オーケストレーションツールを試してください: AnsibleChefSaltstackPuppet など。

Ansibleを使用してサービスを開始および有効化できます。

ansible all -i inv -m service -a 'name=service-name state=started enabled=true'

Ansibleの service モジュールの LinuxService class を見てください:

これはLinuxサービス操作クラスです。現在、起動時に開始されるサービスを制御するため、および現在の状態を制御するために、バイナリとinitスクリプトの混合をサポートしています。

2

あなたの問題は、Debian/Ubuntuが古いsystemdの代わりに新しいsysvinitに切り替えたことです。どちらが優れているかを尋ねると、炎の戦争が始まりますが、いつでも元のsysvinitに戻すことができます。元に戻したい場合は this を確認してください。

1
YoMismo