如何让一个进程成为 systemd 下的服务?

如何让一个进程成为 systemd 下的服务?

命令是什么或者如何将进程变成 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

systemd术语来说,服务是一种单元文件,以及服务、套接字、设备、安装、自动安装、交换、目标、路径、计时器、切片和范围。是的,它基本上是运行系统或用户守护程序的一种方式。你可以自己写。从上面的链接阅读官方文档,并且互联网上提供了许多教程。

答案3

在 Linux 中,有多种方法可以使进程成为服务。正如其他人所提到的,您可以用来systemd执行一个进程并观察其输出,但根据您的语言功能,您可以使用 C 'double ' 的老式方法fork()(python 和其他一些语言也有这种方法)。

当您fork()使用 C 语言时,您创建了一个子进程。父进程实际上会保留该子进程的句柄,但可能不会等待它完成。如果父进程完成,子进程实际上将成为孤立进程。fork()再次ing意味着init(过程1)采用你的新流程。

不管怎样,这一切是如何fork()创建一个守护进程的?好吧,即使父进程退出,子进程也会继续运行 - 这意味着它将控制权返回给执行它的 shell。下面是一个基本示例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;
}

运行它的输出将如下所示: 多田

无论如何,继续:子进程可以像您的程序一样继续永远运行。这实际上是我编写第一个真实程序的方式,控制笔记本电脑上的风扇速度。

相关内容