Linuxでプロセスをサービスに切り替えるコマンドまたは方法は何ですか?サービスは本質的にデーモンプロセスではありませんか?
答え1
ユーザーサービスの例は、これを行う方法を説明する最も簡単な方法です。
mytask
サービスとして実行したいバイナリまたはスクリプトがあります/usr/local/bin/
。
次の内容でホームディレクトリにsystemd
名前が付けられたユニットファイルを作成します。my_example.service
~/.config/systemd/user/
[Unit]
Description=[My example task]
[Service]
Type=simple
StandardOutput=journal
ExecStart=/usr/local/bin/mytask
[Install]
WantedBy=default.target
この行は、ExecStart
実行するバイナリまたはスクリプトのパスを指定する場所なので、最も関連性があります。
起動時にサービスが自動的に開始されるようにするには、次の手順を実行します。
systemctl --user enable my_example.service
再起動せずにすぐにサービスを開始するには、次の手順を実行します。
systemctl --user start my_example.service
サービスを停止するには、次を実行します。
systemctl --user stop my_example.service
サービスの状態を確認するには、次の手順を実行します。
systemctl --user status my_example.service
答え2
答え3
Linuxでは、プロセスをサービスにするいくつかの方法があります。他の人が述べたように、 を使用してsystemd
プロセスを実行し、その出力を見ることができますが、言語能力に応じてCの 'double'を使用する古い方法を使用できますfork()
(Pythonや他の言語にもこの方法があります)。 )。
fork()
C言語を使用すると、子プロセスが生成されます。親プロセスは実際に子プロセスへのハンドルを保持しますが、完了するまで待たないことがあります。親プロセスが完了すると、子プロセスは事実上孤児プロセスになります。fork()
また、ingはinit
(プロセス1)を意味します。使用新しいプロセス。
fork()
とにかく、これらすべてがデーモンを生成するのにどのように機能しますか?さて、親プロセスが終了しても、子プロセスは引き続き実行されます。つまり、子プロセスは、それを実行したシェルに制御権を返すことを意味します。以下は基本的な例ですfork()
。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
void forkexample()
{
int ret = fork();
if (ret == 0) {
fork();
/*
* zomg i could run in here forever
* as a daemon.
* listen for input, monitor logfiles, whatever.
*/
printf("I'm the child!\n");
int x = 0;
while (x < 10) {
printf("Still running...\n");
sleep(1);
x++;
}
}
else {
printf("Child process spawned; pid %i\n", ret);
printf("I'm a parent...\n");
}
}
int main()
{
forkexample();
printf(" and I'm exiting.\n");
return 0;
}
実行結果は次のとおりです。
とにかく続けてください。サブプロセスはプログラムのように永久に実行することができます。これは実際にラップトップのファン速度を制御する最初の実際のプログラムを書いた方法です。