我需要从系统 initrd 映像运行一个简单的守护进程。根据 system.initrd 文档,当 systemd 直接从 initrd 运行时,所有正在运行的进程都将被杀死switch-root
,除非argv[0][0]
主进程的字符是@
。我发现改变argv[0]
它的唯一方法是在应用程序源代码中添加正确的语句,但不幸的是这是一个专有软件,我无权访问其源代码。我还发现 shellexec
命令可以在不同的名称下运行进程,更改它的argv[0]
参数,所以我为 systemd 编写了简单的服务文件,用于exec
部署新进程,它可以工作,ps aux
显示服务进程正在正确的名称(@bin/process-name ...
)下运行。如前所述,以字符argv[0]
开头的进程@
不应在 上被终止switch-root
。
我的系统食谱:
[Unit]
Description=Simple service
[Service]
ExecStart=/bin/bash -c 'exec -a "@bin/process-name" /bin/application'
switch-root
我通过在 initrd 阶段手动启用该服务来确保该服务之前正常工作,但它像任何其他正在运行的进程一样被杀死。我尝试将其作为普通应用程序运行,但这也不起作用。我什至编写了自己的应用程序,将其更改为argv[0][0]
,@
并且就像它被杀死之前一样switch-root
。那么,如何从 initrd 运行持久服务呢?看起来 systemd 会杀死所有进程,不switch-root
留下任何东西,甚至是不应该被杀死的特殊进程。
Initrd: Dracut
OS: Debian Jessie
Systemd version: 208-8
来源:http://www.freedesktop.org/wiki/Software/systemd/RootStorageDaemons/