Linuxでプログラムでサービスをロードする[閉じる]

Linuxでプログラムでサービスをロードする[閉じる]

サービス名(ユーザー作成)とそのパスが与えられた場合、C++Ubuntuのプログラムが実行時にそのサービスをロードして開始する方法は?

Windowsこれを行う、、などに似た機能はありますか?CreateServiceOpenSCManagerOpenService

答え1

まず、ここではなく StackOverflow にある必要があります。

Windowsが知っているサービスの全体的な概念は、Linuxには存在しません。

Windowsでは、プロセスはサービス制御マネージャ(SCM)がサービスを初期化および制御するために使用するコールバックを登録します。これにより、一時停止、停止、開始、再開などのサービスに関してSCMに送信された要求を処理できます。

Linuxではこの概念は存在しません。最も近いのはデーモンとして実行されるプログラムです。

すべてのプログラムは、親プログラム(二重分岐を介して)または端末から分離することを選択できます。これが基本的にUnixのデーモンの鍵です。バックグラウンドプロセスですが、Windowsとは異なり、特別な第三者が関与していません。

ほとんど終わりました。このinitプロセスによってプロセスが収集され、終了後も保持されません。また、通常、一部のinitスクリプト(古いスタイル)またはinitシステム(systemd、upstartなど)は特殊な構文を使用してプロセスを制御します。そのために、ほとんどのデーモンには、スクリプトがそのファイルからプロセスID(PID)を読み取れるようにファイルに保存し、そのプログラムを使用してデーモンkill(つまりバックグラウンドプロセス)を制御する信号を送信するオプションがあります。 。たとえば、設定を再読み込みまたは停止します。

することができます本当にMichael Kerriskの著書「LinuxおよびUNIXシステムのプログラミングに関する確実なガイド」を購入して読むことを望み、開発を別のUnixoidプラットフォーム(OSX)に拡張する予定であれば、APUE(Advanced Programming in Unix Env​​ironments)などの古典的な本を選択することもできます。 。 、BSD...)。

答え2

UNIXシリーズシステムでは、デーモンプロセスと通常プロセスは同じです。それらの間にはぼやけた線があります。本質的に、それらは機能的な方法ではなく期待しているので、意味的に分離されています。デーモンはバックグラウンドでユーザーと通信し、イベントが発生するのを待つプロセスです。デーモンがユーザーと通信する必要がある場合は、ソケット(unixまたはinet)、ファイルシステムの手動観察、デバイスファイルなど、独自の通信設定を担当します。デーモンは通常、ある種の「サービスマネージャ」によって管理されます。 - systemd、upstart、またはsystemV(これは実際の管理ではありません。これを終了する方法を知るために、いくつかのpidファイルを維持し、順番に起動するためのいくつかのinitスクリプトを保持します。)実際に達成したい目標によって異なります。

ターゲットシステムのサービスマネージャでサービスを均一に開始するには、選択したシステムの制御コマンドを呼び出す必要があります(これはディストリビューションによって異なりますが、systemdはますます一般的になっています)。たとえば、電話だけでsystemctl start sshdsshdが起動します。

実際にいくつかの処理を実行するバックグラウンドプロセスが必要な場合、これはまったくデーモンではありません。単純にforkandを使用すると、exec他のプロセス(パイプを介して連絡を続けることができます)を作成し、終了時に子プロセスを終了することができます。 )。

サブプロセスでデュアルフォークを実行し、セッションを確立し、ファイル記述子を閉じて、より適切なデーモンにすることができます。

しかし、実際には達成しようとしている目標によって異なります。おそらくあなたはここで間違った質問をしているでしょうし、Linuxではまったく意味のないことをしようとします。

答え3

似たようなものが見つかりました。 exec 関数を介してサービスを実行する簡単な監視プログラムです。あなたはそれを見つけることができますここ

答え4

サービスとは何かを理解する

サービスはバックグラウンドで実行されるプロセスです。対話型ではなく、制御端末はありません。 Linuxでは、サービスをデーモンと呼びます。

サービスを手動で管理する方法

ターミナル経由

#run program that should be service, output_file stands for stdout output
./executable_path arg1 arg2 > output_file

#press CTRL-Z - stops process
#move process to the background, prints its PID
bg

#disown process or you may have started process with "nohup"
disown

これでサービスがあるので、端末を閉じてもサービスは実行され続けます。

kill "PID print before

サービスが終了しました。

シェルスクリプト経由

サービスを開始し、そのPIDをファイルに保存するスクリプト。

nohup ./executable args > output &
MY_PID=$!
echo $MY_PID > some_folder/service_pid

サービスを終了するスクリプト:

kill `cat some_folder/service_pid`
rm some_folder/service_pid

C++経由

スクリプトを使用して、例と同じ手順を実行できます。次のようにC関数で包みます。systemforkそしてexec*。ただし、これはLinux(unix.stackexchange.com)ではなくプログラミングに関連しています。 C ++での検索生成プロセス。

システムサービスマネージャとの統合

素晴らしい。 Linuxには多くのサービスマネージャがあり、すべてのLinuxディストリビューションが同じサービスマネージャを使用しているわけではないので、これは非常に困難です。ユーザーはサービス管理者を変更する可能性があるため、同じディストリビューションでも同じサービス管理者を使用するという保証はありません。

最も一般的に使用されているのは突然現れるそしてシステム

関連情報