所以我写了一个 golang 应用程序,systemd
每当我的服务器重新启动时,我都希望通过它进行初始化。
这是服务文件:-
[Unit]
Description=golang wiki initialization
[Service]
Type=forking
PIDFile=/tmp/gowiki.pid-3030
User=root
Group=root
WorkingDirectory=/var/www
ExecStart=/bin/bash -c 'daemonize -o stdout.log -e stderr.log /var/www/wiki'
[Install]
WantedBy=multi-user.target
每当我重新启动服务器时,它似乎都运行良好,但是当我gowiki
在终端中像这样手动启动或重新启动时,我仍然遇到轻微的刺激性问题:-
systemctl start gowiki
或者
systemctl restart gowiki
这确实让我的 gowiki 进程运行;然而,在我执行我的systemctl start gowiki
命令后,我被冻结在我的终端中并且该命令似乎没有退出,直到我手动强制使用 Ctrl-C。
导致这个问题我做错了什么?
这奏效了。
因为
Type=forking
服务期望父服务在服务实际启动之前退出。如果父级永远不会退出,那么 systemctl start 不会给你一个提示,因为它认为它没有完成执行。如果您不介意为 systemd 稍微调整一下代码,那么到目前为止我发现的最干净的解决方案是使用 SDNotify 信号。
您相应的 systemd 单元文件: