相关疑难解决方法(0)

为什么 systemd 中的简单类型服务“进程不能分叉”?

我想编写自己的systemd单元文件来管理真正长时间运行的命令1(以小时为单位)。在查看关于 systemdArchWiki 文章时,它说明了以下关于选择启动类型的内容:

Type=simple(默认):systemd 认为服务会立即启动。进程不能 fork。如果需要在此服务上订购其他服务,请不要使用此类型,除非它是套接字激活的。

为什么进程根本不能分叉?它是指以守护进程召唤过程(父分叉,然后退出)的风格进行分叉,还是任何类型的分叉?


1我不想要 tmux/screen,因为我想要一种更优雅的方式来检查状态和重新启动服务,而无需求助于tmux send-keys.

fork systemd

13
推荐指数
2
解决办法
2400
查看次数

Systemd 超时,因为它没有检测到守护进程分叉

我目前正在开发一个 systemd 守护进程。我面临的问题是守护进程在蜜蜂启动后 1 分 30 秒被杀死,因为没有检测到分叉。

我正在使用该int daemon(int nochdir, int noclose)函数来守护进程。

int main()
{
    openlog("shutdownd", LOG_PID, LOG_DAEMON);

    if(daemon(0, 0) != 0)
    {
        syslog(LOG_ERR, "Error daemonizing process : %s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }
    syslog(LOG_NOTICE, "Daemon started !\n");

    pthread_create(&threads[0], NULL, &alimThread, NULL);
    pthread_create(&threads[1], NULL, &extinctThread, NULL);
    pthread_create(&threads[2], NULL, &blinkThread, NULL);

    while(1)
    {
    }

    syslog(LOG_NOTICE, "Daemon stopped !\n");
    exit(EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)

这是服务文件 /etc/systemd/system/shutdownd.service

[Unit]
Description=Shutdown Daemon
After=syslog.target

[Service]
Type=forking
PIDFile=/var/run/shutdownd.pid
ExecStartPre=/bin/rm -f /var/run/shutdownd.pid
ExecStartPre=/usr/bin/shutdownd-exportGpio.sh
ExecStart=/usr/bin/shutdownd
Restart=on-abort

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

守护程序函数应该派生进程并将其与终端分离,我还关闭文件描述符并将工作目录更改为 /。

然而,systemd 似乎没有检测到分叉,因为它在 …

linux fork systemd timeout daemon

3
推荐指数
1
解决办法
5983
查看次数

标签 统计

fork ×2

systemd ×2

daemon ×1

linux ×1

timeout ×1