我为 jekyll 创建了自己的服务,当我启动该服务时,它似乎没有作为后台进程运行,因为我被迫ctrl+c退出它。由于 --watch,它只是停留在前台。我不知道如何绕过它并使其在后台运行。有什么想法吗?
# /etc/systemd/system/jekyll-blog.service
[Unit]
Description=Start blog jekyll
[Service]
Type=forking
WorkingDirectory=/home/blog
ExecStart=/usr/local/bin/jekyll build --watch --incremental -s /home/blog -d /var/www/html/blog &
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
User=root
Group=root
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
Mic*_*fin 74
Systemd 能够处理各种不同的服务类型,特别是以下之一
simple - 一个长时间运行的进程,它不会将其自身作为后台并与外壳保持连接。forking - 一个典型的守护进程,它自己分叉,将它从运行它的进程中分离出来,有效地使自己成为后台。oneshot - 预计将退出的短期进程。dbus - 很简单,但是进程启动完成的通知是通过 dbus 发送的。notify - 很简单,但是进程启动完成的通知是通过 inotify 发送的。idle - 很简单,但二进制文件是在分派作业后启动的。在您的情况下,您选择了Type=forking这意味着 systemd 正在等待进程自行分叉并等待父进程结束,这表明该进程已成功启动。但是,您的进程没有这样做 - 它保留在前台,因此systemctl start将无限期挂起或直到进程崩溃。
相反,您想要Type=simple,这是默认值,因此您可以完全删除该行以获得相同的效果。在这种模式下,systemd 不会等待进程完成启动(因为它无法知道何时发生),因此会立即继续执行和依赖服务。在您的情况下,没有,所以这无关紧要。
关于安全的小说明:
您以 root 身份运行该服务,这是不鼓励的,因为它不如以非特权用户身份运行它安全。这样做的原因是,如果jekyll 中存在允许执行命令的漏洞(可能通过它正在解析的代码),那么攻击者无需执行任何其他操作即可完全拥有您的系统。另一方面,如果它以非特权用户身份运行,则攻击者只能造成与该用户一样多的损害,并且现在必须尝试获得 root 权限才能完全拥有您的系统。它只是增加了攻击者必须去的额外层。
您可以简单地以运行您的 Web 服务器的同一用户身份运行它,但这会让您容易受到另一次潜在攻击。如果您的 Web 服务器中存在允许用户操作您系统上的文件的漏洞,他们可以修改生成的 html 文件,或者最坏的情况是源文件并导致您的服务器提供他们想要的任何内容。但是,如果生成的文件和源文件只能由网络服务器读取并且可由另一个非特权用户写入,他们将无法通过攻击网络服务器轻松修改它们。
但是,如果您只是从该服务器提供静态文件并让服务器保持最新状态,那么这些攻击是非常不可能的——但仍然有可能。您有责任根据系统的关键程度权衡风险与设置开销,但这两个技巧都非常易于设置,并且几乎没有维护开销。
| 归档时间: |
|
| 查看次数: |
58497 次 |
| 最近记录: |