代码之家  ›  专栏  ›  技术社区  ›  boardrider Patrick K

如何调试失败的systemctl服务(代码=退出,状态=217/用户)?

  •  27
  • boardrider Patrick K  · 技术社区  · 7 年前

    我正在尝试将我的第一个服务添加到 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服务,使其不会一直死机并自动重新启动?

    2 回复  |  直到 3 年前
        1
  •  52
  •   JoshMc    6 年前

    错误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。服务 未启动,并且您指定了一个仅在Active Directory中可用的用户,您希望将该服务添加到 After= 线例如:

    After=network.target vasd.service
    
        2
  •  0
  •   rogerdpack    3 年前

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

    对于217/用户,这里有一些好的建议:

    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期望指定的用户在服务启动时“可用”。因此,对于“系统用户”(启动早期运行的进程),他们需要在本地框中可用。对于以后启动的流程,他们可以是“网络用户”。

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

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

    在我们的案例中,运行“vintela status”时会显示一条消息“SELinux可能未正确配置”,并且可以肯定的是,在禁用SELinux后,它开始按预期工作,不再是217。[红帽8]