当运行systemctl enable时,出现“执行操作失败:无效参数”是什么意思?

23

我已创建了一个systemd服务文件(专门用于svnserve;实际上,我正在使用来自这里的示例https://dev59.com/1Zjga4cB1Zd3GeqPNKJh#40584047),当我启用它时,输入

sudo systemctl enable svnserve

我收到了响应

Failed to execute operation: Invalid argument

运行

sudo systemctl status svnserve
产出。
● svnserve.service - Subversion protocol daemon
   Loaded: loaded (/etc/systemd/system/svnserve.service; enabled; vendor preset: enabled)
   Active: inactive (dead)

没有给我任何关于错误的线索。我可以启动服务而不会出现任何错误,它似乎按预期运行,即使在启动systemctl status之后,我仍然没有发现任何错误的线索:

● svnserve.service - Subversion protocol daemon
   Loaded: loaded (/etc/systemd/system/svnserve.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2018-01-09 22:10:14 UTC; 6s ago
  Process: 9677 ExecStart=/usr/bin/svnserve $DAEMON_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 9678 (svnserve)
    Tasks: 1
   Memory: 964.0K
      CPU: 2ms
   CGroup: /system.slice/svnserve.service
           └─9678 /usr/bin/svnserve --daemon --pid-file /run/svnserve/svnserve.pid --root /srv/svn/repos --log-file /var/log/svnserve/svnserve.log

那么这个错误信息是什么意思?"无效参数"应该适用于哪个级别的内容?svnserve命令的某个参数?服务文件中的某个属性?还是servicectl命令本身的命令行参数?

顺带一提,这是在一个Ubuntu 16.04 LTS服务器上。


我曾想过这可能与运行“sudo systemctl enable svnserve”而不是“sudo systemctl enable svnserve.service”有关,但实际上并没有任何区别。 - EricS
9个回答

24
如果你从一个编码系统(如Windows)复制/粘贴文件到另一个编码系统(如Linux),可能会出现文件编码问题或字符被不同解释的问题。你可以转换文件并重新分析,以查看它是否被正确解释。
1. 运行分析器。
2. 修复服务文件的编码,例如使用vim(从这里开始回答)。
3. 编辑文件并删除任何现在显示在文件开头的奇怪字符,例如它可能有类似于^[[200~的字符。
4. 保存文件并重新启用服务。

1
“sudo systemd-analyze verify yourname.service” 最终让我找到了隐藏的问题。在我的情况下,由于复制粘贴,文件末尾有一些空格。 - Robert Kearns
@RobertKearns 很棒。很高兴能帮到你! - culix

22

我遇到了类似的情况,在我的案例中,从 [Install] 部分中删除 Alias 行后问题消失了。感谢另一个帖子中的 Anton:https://dev59.com/CmIj5IYBdhLWcg3wRjWr#34978908 - 别名名称可能与服务名称不同。


2
浪费了这么多时间,为什么他们不把错误提示得更清楚呢... - sscirrus
感谢您提供的解决方案。但是在2022年,仍然出现了相同的模糊错误信息。我花费了很长时间来解决这个问题,因为之前的解决方案实际上建议添加别名。 - carpii
太准了!别名(redis.service)被之前手动创建的(已禁用)尝试占用了。将其移开后,systemctl enable redis-service.service的问题得到了解决。 - undefined

7

我还发现了与注释相关的错误(至少在systemd 219中),如果在服务文件的任何代码后面有注释,则启用它将失败。因此,将注释移到新行或删除它。我进行了测试,并且对我有效:

WantedBy=multi-user.target
# runs in init 3 (multi-user mode for linux)

这个不起作用:

WantedBy=multi-user.target  # runs in init 3 (multi-user mode for linux)

这里有一些讨论:https://github.com/rabbitmq/rabbitmq-server/issues/1422

(注:此文本已被翻译为中文,无需再次翻译)

4

所以,我猜我们已经有了一个类似的答案。我只想指出原因。

答案:

cd /etc/systemd/system/multi-user.target.wants/  # it can be other WantedBy item
ls -lA              # notice that <your>.service is not a link
rm <your>.service   # remove it

现在尝试一下:

sudo systemctl enable <your>.service

它应该创建正确的链接并使您的服务可用。

同样的问题,/etc/systemd/system/multi-user.target.wants/docker.service 不是一个指向 /ib/systemd/system/docker.service 的符号链接,而是一个过时的、之前的副本... 删除这个副本后,sudo systemctl enable ... 现在可以顺利完成而不出错了。 - cueedee

3
我有过完全相同的经历。删除“别名”可以解决问题,但实际上,别名可以与服务文件具有相同的名称。
原因在于服务文件所在的目录。systemd enable 的作用是在目录“/etc/systemd/system”和需要此服务的目标目录中创建别名。如果原始服务文件已位于“/etc/systemd/system”,当systemd尝试启用此服务时,无法创建别名。
解决方案是将服务文件放置在目录“/lib/systemd/system/”中,这样就可以正常工作。

2
在您的/etc/systemd/system/youunit.service文件的最后一行后,需要添加CR符号。 检查并删除/etc/systemd/system/multi-user.target.wants/youunit.service。 然后再次尝试使用systemctl enable youunit

2

请尝试以下方法,我已经解决了这个问题:

  1. 进入目录 /etc/systemd/system/multi-user.target.wants

  2. 列出当前目录下的文件列表

  3. 查找错误信息 "Failed to execute operation: Invalid argument"

  4. 删除 yourname.service 文件

  5. 进入目录 /etc/systemd/system/

  6. 使用 nano 命令编辑 yourname.service 文件

修改你的服务内容(可能存在符号 [ ] 等错误)

==> 保存文件

  1. 重新加载 daemon

  2. 启用 yourname.service 服务

祝好运!


1
在我的情况下,问题是服务是指向另一个文件的符号链接。systemd-analyze没有发现任何问题,但systemctl enable失败了。当我删除符号链接并复制文件时,它开始工作了。

0
在我的情况下,我的 /etc/systemd/system/my-service.service 是一个符号链接 :S。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接