如果 systemd 服务失败,请打开运行命令的终端

Ada*_*ths 5 services systemd

我有一个自定义的 systemd 服务。有时它会失败,因为我需要重新生成 ssh 密钥。错误信息如下:

unison.service - Unison Sync
   Loaded: loaded (/etc/systemd/system/unison.service; disabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Mon 2019-10-07 09:14:25 IST; 884ms ago
  Process: 14607 ExecStart=/home/adamfg/bin/unison default (code=exited, status=3)
Main PID: 14607 (code=exited, status=3)
Run Code Online (Sandbox Code Playgroud)

发生此错误时,我希望打开一个终端,运行重新生成 mt ssh 密钥所需的命令,我该如何执行此操作?

dob*_*bey 5

首先,你的服务应该是用户服务。系统服务无法打开终端来执行您想要的操作。如果它必须是系统服务,则需要创建一种在登录系统时向自己发送通知的方法,以便您可以执行任务并重新启动服务。但作为用户服务,它会在您登录时运行,如果服务启动失败,您可以使用以下方法在登录时弹出终端。

您的服务文件应该位于PartOf=graphical-session.target服务[Unit]部分,并且Restart=always指向[Service]运行ExecStart=的 shell 脚本

/home/adamfg/bin/unison default || gnome-terminal -e "bash -c 'genkey_command && exit 1'"
Run Code Online (Sandbox Code Playgroud)

或者类似的。这将导致您的服务在您登录图形会话时启动,如果失败,则打开一个genkey_command等待输入的终端,但始终会退出 1,从而导致服务在生成新密钥后重新启动。

您还可以使 shell 脚本更加复杂,以便在生成新密钥后直接启动,而不是依赖 systemd 服务重新启动,然后干净地退出。