运行 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 时“执行操作失败:参数无效”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章