为什么 HAVEGED 需要重新启动才能启动?

为什么 HAVEGED 需要重新启动才能启动?

今天,我将 havged 安装到了我的 Arch Linux 系统(滚动版本,systemd)。

# systemctl start haveged

应该启动守护进程,但这行不通。这就是日志所说的:

systemd[3916]: haveged.service: Failed at step STDIN spawning /usr/bin/haveged: No such file or directory
systemd[1]: haveged.service: Main process exited, code=exited, status=208/STDIN
systemd[1]: haveged.service: Unit entered failed state.
systemd[1]: haveged.service: Failed with result 'exit-code'.

日志中的第一条错误消息是错误的。/usr/bin/haveged当然确实存在。我什至尝试删除软件包并重新安装它,但没有任何帮助,守护进程无法正常启动。我什至尝试使用重启 systemdsystemctl daemon-reload但无济于事。

最后,我重新启动了系统,瞧,haveged 就可以正常启动了。

为什么需要重新启动?我可以采取什么不同的措施来避免这种重启吗?

更新:单元文件的内容:

$ /usr/lib/systemd/system/haveged.service

[Unit]
Description=Entropy Harvesting Daemon
Documentation=man:haveged(8)

[Service]
ExecStart=/usr/bin/haveged -F -w 1024 -v 1
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

答案1

日志中的第一条错误消息是错误的。

这并没有错:)

systemd[3916]: haveged.service: Failed at step STDIN spawning /usr/bin/haveged: No such file or directory

关键信息是Failed at step STDIN

这是什么意思?

有一个指令StandardInput=:

控制已执行进程的文件描述符 0 (STDIN) 连接到的位置。采用 null、tty、tty-force、tty-fail 或 socket 之一。

...

该设置默认为空

服务启动失败这里:

r = setup_input(context, params, socket_fd);

setup_input失败的这里:

case EXEC_INPUT_NULL:
            return open_null_as(O_RDONLY, STDIN_FILENO);

open_null_as:

    fd = open("/dev/null", flags|O_NOCTTY);
    if (fd < 0)
            return -errno;

    if (fd != nfd) {
            r = dup2(fd, nfd) < 0 ? -errno : nfd;
            safe_close(fd);
    } else
            r = nfd;

所以,open("/dev/null", O_RDONLY|O_NOCTTY)失败了:No such file or directory

你能重现它吗?

  • 清除包
  • 重启
  • 安装包
  • 系统控制启动

您可以附加 的输出吗systemctl cat haveged

相关内容