命令是什么或者如何将进程变成 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()
创建一个守护进程的?好吧,即使父进程退出,子进程也会继续运行 - 这意味着它将控制权返回给执行它的 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;
}
运行它的输出将如下所示:
无论如何,继续:子进程可以像您的程序一样继续永远运行。这实际上是我编写第一个真实程序的方式,控制笔记本电脑上的风扇速度。