相关疑难解决方法(0)

Systemd 启动后立即终止服务

我正在systemd为 OSSEC HIDS编写单元文件。问题是,当systemd启动服务时,它会立即停止它们。

当我使用以下ExecStart指令时,一切正常。

ExecStart=/var/ossec/bin/ossec-control start
Run Code Online (Sandbox Code Playgroud)

但是当我进行以下小的改进时,我在 OSSEC 日志中发现它SIG 15在启动后收到。

ExecStart=/bin/sh -c '${DIRECTORY}/bin/ossec-control start'
Run Code Online (Sandbox Code Playgroud)

如果我再做一个小的更改,服务将SIG 15在 20 秒后收到。

ExecStart=/bin/sh -c '${DIRECTORY}/bin/ossec-control start && sleep 20'
Run Code Online (Sandbox Code Playgroud)

所以,我想,这会在服务启动后systemd杀死/bin/sh进程,/bin/sh然后杀死OSSEC.

我怎么解决这个问题?

kill centos systemd

16
推荐指数
1
解决办法
2万
查看次数

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

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

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

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


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

fork systemd

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

systemd 可以处理双叉守护进程吗?

systemd 可以处理双叉守护进程吗?

我以前使用init.d/脚本来管理我编写的守护进程,这些守护进程多年来一直完美运行。现在我发现自己需要提供一个systemd/脚本,但我无法让它与我执行守护程序设置代码的方式一起工作。

当我设置一个守护进程时,我分叉两次以释放控制终端并避免成为会话领导者。

问题是我已经确认当你这样做时systemd/会失去跟踪并杀死守护进程。我还确认跳过第二个 fork 可以使其再次与systemd/一起工作。

我的基本(为了讨论的目的稍微简化)systemd/脚本是

[Unit]
Description=GM7 Service Daemon

[Service]
Type=forking
ExecStart=/usr/bin/g7ctrl

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

所以我想我的问题是:我是否需要改变过去十年在 C/C++ 中完成守护进程设置代码的方式,或者是否有选项让 systemd/ 来跟踪双分叉?

我还没有完全了解内部工作原理,如果 systemd 本身为它启动的每个守护进程生成进程,在这种情况下,我的双叉确实会过时

我承认我这样做的方式(双叉)部分是出于历史原因,但当时我对最佳实践进行了一些相当深入的阅读,这就是我后来想到的(大约十年前)

systemd daemon

5
推荐指数
1
解决办法
3845
查看次数

为什么在服务的单元文件中使用分叉?

我的 nginx 单元文件如下,

[root@arif ~]# cat /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

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

在这里,在该[Service]部分中,的值Type等于forking这意味着从这里开始

以 ExecStart 启动的进程会生成一个子进程,该子进程成为服务的主进程。启动完成后,父进程退出。

我的问题是,

  • 为什么服务会这样做? …

linux fork systemd

4
推荐指数
1
解决办法
2191
查看次数

CentOS 7 - 使用 systemctl 启动无头虚拟机挂起

我不完全确定我正在尝试做的事情是否可行。我想将 vbox 虚拟机作为服务运行并在启动时启用它。这是我的 .service 脚本:

[Unit]
Description=Virtualbox Headless VM
Wants=network-online.target
After=network-online.target

[Service]
Type=forking
ExecStart=/usr/bin/VBoxHeadless -s vbox_uuid
ExecStop=/usr/bin/VBoxManage controlvm vbox_uuid poweroff
User=myuser

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

当我尝试正常启动时,我的 cli 挂起并且不会分叉该过程。有人有任何想法/想法/建议吗?

systemctl status 给了我这个:

Jun 20 07:17:07 localhost.localdomain systemd[1]: Starting Virtualbox Headless VM...
Jun 20 07:17:09 localhost.localdomain pulseaudio[4143]: [pulseaudio] socket-server.c: bind(): Address already in use
Jun 20 07:17:09 localhost.localdomain pulseaudio[4143]: [pulseaudio] module.c: Failed to load module "module-esound-protocol-unix" (argument: ""): initialization failed.
Jun 20 07:17:09 localhost.localdomain pulseaudio[4143]: [pulseaudio] main.c: Module load failed.
Jun 20 07:17:09 localhost.localdomain …
Run Code Online (Sandbox Code Playgroud)

centos virtualbox services

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

进程背景本身可以吗?

进程背景本身可以吗?

什么是 Perl 和/或 C 实现?

linux glibc

3
推荐指数
2
解决办法
855
查看次数

标签 统计

systemd ×4

centos ×2

fork ×2

linux ×2

daemon ×1

glibc ×1

kill ×1

services ×1

virtualbox ×1