运行 systemctl enable 时“执行操作失败:参数无效”是啥意思?

Posted

技术标签:

【中文标题】运行 systemctl enable 时“执行操作失败:参数无效”是啥意思?【英文标题】:What does "Failed to execute operation: Invalid argument" mean when running systemctl enable?运行 systemctl enable 时“执行操作失败:参数无效”是什么意思? 【发布时间】:2018-06-19 00:59:14 【问题描述】:

我创建了一个 systemd 服务文件(专门用于 svnserve;我实际上使用的是这里的示例 https://***.com/a/40584047/464087),当我启用它时,输入

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 命令本身的命令行参数?

FWIW 这是在 Ubuntu 16.04 LTS 服务器上。

【问题讨论】:

我想知道这与运行“sudo systemctl enable svnserve”而不是“sudo systemctl enable svnserve.service”有关,但不,没有区别。 【参考方案1】:

就我而言,我的 /etc/systemd/system/my-service.service 是一个符号链接:S

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

如果您将文件从具有一种编码的系统(例如 Windows)复制/粘贴到另一种编码(例如 linux),则文件编码可能存在问题,或者字符的解释不同。您可以转换文件并重新分析以查看它是否被正确解释。

    运行分析器

$ sudo systemd-analyze verify yourname.service /etc/systemd/system/yourname.service:1: Assignment outside of section. Ignoring.

    修复服务文件的编码,例如使用 vim (answer from here)

$ vim +"set nobomb | set fenc=utf8 | x" yourname.service

    编辑文件并删除现在暴露的任何奇怪字符,例如文件的开头。例如它可能有 ^[[200~

    之类的字符

    保存文件并重新启用服务

$ sudo systemctl enable yourname.service

【讨论】:

sudo systemd-analyze verify yourname.service 是最终导致我发现隐藏问题的原因。就我而言,我在复制粘贴的文件末尾有一些空白。 @RobertKearns 太棒了。很高兴它有帮助!【参考方案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 ... 现在完成而没有错误的原因。跨度> 【参考方案5】:

/etc/systemd/system/youunit.service 文件的最后一行之后,需要CR 符号。 检查它并删除/etc/systemd/system/multi-user.target.wants/youunit.service。 然后再试试systemctl enable youunit

【讨论】:

【参考方案6】:

我还发现了 cmets 的 bug(至少在 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

【讨论】:

【参考方案7】:

我经历了完全相同的事情。删除“别名”是可行的,但实际上,别名可以与服务文件同名。

它不起作用的原因与放置服务文件的目录有关。

systemd enable 的作用是在目录“/etc/systemd/system”和需要此服务的目标目录中创建一个别名。如果原始服务文件已经位于“/etc/systemd/system”,当systemd尝试启用该服务时,无法创建别名。

解决方法是将服务文件放在目录“/lib/systemd/system/”下,就可以了。

【讨论】:

【参考方案8】:

你试试这个,我解决了:

    cd /etc/systemd/system/multi-user.target.wants

    ls

    查找名称服务错误“执行操作失败:参数无效”

    rm -rf yourname.service

    cd /etc/systemd/system/

    nano yourname.service

编辑您的内容服务(可能是您的内容错误(检查 symboy [, ],...bla..bla)

==> 保存

    systemctl daemon-reload

    systemctl enable yourname.service

祝你好运!!!

【讨论】:

【参考方案9】:

我有一个类似的情况,在我的情况下,从 [Install] 部分中删除 Alias 行后问题就消失了。感谢 Anton 在另一个线程中:https://***.com/a/34978908/2711456 - 别名的名称可能与服务名称不同。

【讨论】:

在这上面浪费了几个小时。他们为什么不让错误更清楚......

以上是关于运行 systemctl enable 时“执行操作失败:参数无效”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

linux centos6.7 systemctl enable mariadb 无法执行啥原因

systemctl里万恶的203

linux常用命令:systemctl 命令

Linux关闭防火墙命令

centos7 systemctl命令

systemctl 管理服务