查看 Ubuntu 16.04.4 中 networking.service 的“状态”,显示“ExecStartPre”失败:
● networking.service - Raise network interfaces
Loaded: loaded (/lib/systemd/system/networking.service; enabled; vendor preset: enabled)
Drop-In: /run/systemd/generator/networking.service.d
└─50-insserv.conf-$network.conf
Active: active (exited) since Tue 2018-04-10 00:47:02 EDT; 11h ago
Docs: man:interfaces(5)
Process: 735 ExecStart=/sbin/ifup -a --read-environment (code=exited,
status=0/SUCCESS)
Process: 731 ExecStartPre=/bin/sh -c [ "$CONFIGURE_INTERFACES" != "no" ]
&& [ -n "$(ifquery --read-environment --list --exclude=lo)" ]
&& udevadm settle (code=exited, status=1/FAILURE)
Main PID: 735 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/networking.service
有问题的是代码失败:
Process: 731 ExecStartPre=/bin/sh -c [ "$CONFIGURE_INTERFACES" != "no" ]
&& [ -n "$(ifquery --read-environment --list --exclude=lo)" ]
&& udevadm settle (code=exited, status=1/FAILURE)
在深入研究 networking.services 脚本的设置方式后,我发现它使用一个文件来设置 EnvironmentFile=-/etc/default/networking 中“$CONFIGURE_INTERFACES”的环境:
# Configuration for networking init script being run during
# the boot sequence
# Set to 'no' to skip interfaces configuration on boot
#CONFIGURE_INTERFACES=yes
但是,这被禁用(注释掉),然后手动运行脚本的命令:
$ sh -c [ "$CONFIGURE_INTERFACES" != "no" ] && [ -n "$(ifquery --read-environment --list --exclude=lo)" ]
产生输出:
:1:[:缺失]
如果我将环境设置为“是”,也会得到相同的结果
export CONFIGURE_INTERFACES=yes
是: 1: [:缺失]
我不确定这行代码到底应该产生什么结果才能成功执行。在此先感谢任何回答如何纠正此问题或是否可以忽略此问题的人。
答案1
(code=exited, status=1/FAILURE)
有关 networking.service状态的详细信息ExecStartPre=
,请参阅https://unix.stackexchange.com/a/435190/281844。
记录显示,这是在https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=894759我给他们发送了一个补丁来修复它,所以它最终可能会进入 Ubuntu 并最终得到修复 :-)
关于尝试模拟命令的测试,您需要在那里使用单引号(即使 systemd 输出没有显示它们。)
正确的是:
sh -c '[ "$CONFIGURE_INTERFACES" != "no" ] && [ -n "$(ifquery --read-environment --list --exclude=lo)" ]'
您还可以查看系统上文件的内容,或者该单元正在使用的确切命令的/lib/systemd/system/networking.service
命令输出。systemctl cat networking.service
ExecStartPre=