如何调试失败的 systemctl 服务(code=exited,status=217/USER)?

How to debug a failed systemctl service (code=exited, status=217/USER)?

我正在尝试在 rhel7(位于 AWS/EC2)上添加我的第一个服务,但是 - 服务配置不正确 - 正如我得到的:

[ec2-user@ip-172-30-1-96 ~]$ systemctl status clouddirectd.service -l
● clouddirectd.service - CloudDirect Daemon
   Loaded: loaded (/usr/lib/systemd/system/clouddirectd.service; enabled; vendor preset: disabled)
   Active: activating (auto-restart) (Result: exit-code) since Tue 2018-01-09 16:09:42 EST; 8s ago
 Main PID: 10064 (code=exited, status=217/USER)

Jan 09 16:09:42 ip-172-30-1-96.us-west-1.compute.internal systemd[1]: clouddirectd.service: main process exited, code=exited, status=217/USER
Jan 09 16:09:42 ip-172-30-1-96.us-west-1.compute.internal systemd[1]: Unit clouddirectd.service entered failed state.
Jan 09 16:09:42 ip-172-30-1-96.us-west-1.compute.internal systemd[1]: clouddirectd.service failed.

另外:

[ec2-user@ip-172-30-1-96 ~]$ systemctl is-active clouddirectd
activating
[ec2-user@ip-172-30-1-96 ~]$ sudo systemctl list-units --type service --all | grep clouddirectd
  clouddirectd.service                                  loaded    activating auto-restart CloudDirect Daemon

我的单元文件是:

[ec2-user@ip-172-30-1-96 ~]$ cat /usr/lib/systemd/system/clouddirectd.service
[Unit]
Description=CloudDirect Daemon
After=network.target

[Service]
Environment=AWS_SHARED_CREDENTIALS_FILE=/etc/sonar/.aws/credentials
#ExecStart=/usr/lib/sonar/clouddirect/virtualenv/bin/python /usr/bin/sonar/clouddirectd -c /etc/sonar/clouddirect/clouddirectd.conf
ExecStart=/usr/lib/sonar/clouddirect/virtualenv/bin/python /usr/bin/clouddirect -c /etc/sonar/clouddirect.conf
# @PERM@ allow group write permission on newly created files
UMask=0007
#User=clouddirectd
User=clouddirect
Group=sonar
KillSignal=SIGINT
TimeoutStopSec=60min
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

您能否建议如何调试此 systemctl 服务,使其不会一直死机并自动重启?

错误 217 表示在服务尝试启动时用户不存在。在您的情况下,您的服务中指定的用户是 clouddirect.

 Main PID: 10064 (code=exited, status=217/USER)

Jan 09 16:09:42 ip-172-30-1-96.us-west-1.compute.internal systemd[1]: clouddirectd.service: main process exited, code=exited, status=217/USER

这可能是因为这不是实际的用户名(例如,如果它有拼写错误),如果用户是某个外部用户存储(例如:LDAP 或 Active Directory)的一部分,也可能导致这种情况并且需要启动的允许 Linux 服务器访问外部用户存储的服务尚未启动。例如,vasd.service 启动一个产品,用于允许 Linux 针对 Active Directory 进行身份验证,如果 vasd.service 未启动并且您指定了一个仅在 Active Directory 中可用的用户,您可能希望在您的 After= 行中添加该服务。例如:

After=network.target vasd.service

问题分为两部分。一个是如何诊断 217/USER,另一个是如何修复它。我只关注前者。

对于 217/USER,这里有一些很好的建议:

https://www.reddit.com/r/linuxquestions/comments/oaya49/systemd_service_not_starting_with_status217/

217 并不“总是”表示这是一个用户问题,它只是表示它以 217 退出。可能会也可能不会...

您可以使用 journalctl 来查看哪些服务的日志“似乎在它出现后出现”最初或什么没有。

系统启动时“网络用户”可能还不可用,您可以通过添加 After=nss-user-lookup.target https://systemd.io/UIDS-GIDS/ 来解决这个问题,尽管这里不是这种情况,因为重新启动后仍然失败,这是稍后的事情。 systemd 期望指定的用户在服务启动时“可用”。因此,对于“系统用户”(启动早期 运行ning 进程),他们需要在本地框上可用。对于稍后启动的进程,他们可以是“网络用户”。

您也可以尝试将您的组和用户名(和环境)更改为您“认为”systemd 运行ning 并手动 运行 它,看看会发生什么。 https://serverfault.com/questions/410577/execute-a-command-from-another-group 有点希望 systemd 输出更多的调试,这样你就可以更容易地分辨出它是什么 运行ning...

在某些奇怪的情况下,您可能需要同时指定 User= 和 Group= https://superuser.com/a/1452367/39364

在我们的案例中 运行ning“vintela status”有一条消息“SELinux 可能未正确配置”,果然,在禁用 SELinux 后,它开始按预期工作,不再是 217。[redhat 8 ]