Fedora 27 启动时不运行 rc.local

Fedora 27 启动时不运行 rc.local

我试图让 Shadowsocks 服务器在启动后自动运行,并且我使用了该rc.local文件,但它不起作用。

rc.local就是现在:

/usr/local/bin/ssserver -c /etc/shadowsocks.json -d start
#!/bin/bash
exit 0
  • 我添加了a+x特权/etc/rc/d/rc.local
  • 我还按照建议修复了符号链接/etc/rc.local -> /etc/rc.d/rc.local(默认权限)777这里

但是,启动时,中的代码rc.local仍然无法运行。原来rc.local系统启动时并没有运行。在一些帮助下这里,我能够进一步诊断问题。

这是/etc/systemd/system/rc-local.service文件(我没有更改任何内容):

[Unit]
Description=/etc/rc.d/rc.local Compatibility
ConditionFileIsExecutable=/etc/rc.d/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.d/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

-- 这个文件可以吗?

当我这样做时systemctl enable rc-local,我收到此错误:

The unit files have no installation config (WantedBy, RequiredBy, Also, Alias
settings in the [Install] section, and DefaultInstance for template units).
This means they are not meant to be enabled using systemctl.
Possible reasons for having this kind of units are:
1) A unit may be statically enabled by being symlinked from another unit's 
.wants/ or .requires/ directory.
2) A unit's purpose may be to act as a helper for some other unit which has
a requirement dependency on it.
3) A unit may be started when needed via activation (socket, path, timer,
D-Bus, udev, scripted systemctl call, ...).
4) In case of template units, the unit is meant to be enabled with some
instance name specified.

我不确定我的情况是什么原因,因为rc.local文件太简单了。

答案1

你的 rc.local 已损坏!

/usr/local/bin/ssserver -c /etc/shadowsocks.json -d start
#!/bin/bash
exit 0

应该

#!/bin/bash
/usr/local/bin/ssserver -c /etc/shadowsocks.json -d start
exit 0

编辑:

我不太清楚您的rc.localsystemd 服务出了什么问题。

然而,我会为shadowsocks创建一个单独的systemd单元,这样你就可以启动和停止它......例如,当你想要重新加载配置时,你以及其他必须维护服务器的人都知道重启什么服务。

示例 Shadowsocks systemd 单元文件:

[Unit]
Description=Shadowsocks proxy server

[Service]
User=www-shadow
Group=www-shadow
Type=simple
ExecStart=/usr/local/bin/ssserver -c /etc/shadowsocks/shadowsocks.json -a shadowsocks -v start
ExecStop=/usr/local/bin/ssserver -c /etc/shadowsocks/shadowsocks.json -a shadowsocks -v stop

[Install]
WantedBy=multi-user.target

注意,这里我们有一个用户www-shadow来运行代理,该用户是www-shadow组的成员。为了保持/etc整洁,最好创建一个/etc/shadowsocks目录并将 JSON 以及任何其他与 Shadowsocks 相关的文件放在其中。我从以下网站获得了上面 systemd 单元文件的基础知识linode.com,但是,他们希望以 root 身份运行代理(baaaaaaaaaad)...鉴于它8388默认使用端口,我怀疑这是必要的。请注意,如果您不www-shadow为该单元创建用户和组,systemd 将愉快地运行该服务root(长话短说,“显然”是设计使然)。

我没有使用shadowsocks的经验(我只使用过squid作为代理,使用ssh作为socks代理;-)并且没有时间去查找它,但是在快速查看了单元文件之后,它看起来很合理(除了愚蠢之外root)。

使用rc.local单元文件(用于向后兼容)没有多大意义,恕我直言,您错过了 ExecStop 并且您必须记住 rc.local 是shadowsocks ...

如果你想修复这个rc.local单元,它必须是755chmod 755 /etc/rc.d/rc.local),没有人想要一个世界可写的守护进程脚本,这可能是另一个问题。恕我直言,systemd 并不总是合理的,但我怀疑它会运行一个世界可写的脚本。

为了安全起见,您可以ls -l /etc/rc.d/rc.local在问题中发布 的输出吗?

编辑2:

D'oh(我很傻,它一直在那里,我没有注意到),你的单元文件缺少一个[Install]指令:

[Install]
WantedBy=multi-user.target

答案2

Fedora 27 使用systemd不运行/etc/rc.local

有几个建议的解决方案或解决方法询问Ubuntu

答案3

要确定 /etc/rc.local 是否正在“运行”,您可以在 /etc/rc.local 中输入类似的内容

/bin/date >> /root/test.txt

重新启动并查看文件/root/test.txt 中是否有日期。

答案4

GUI 可以轻松启动和停止各种应用程序;尝试安装和使用gnome-tweak-tool(当然,前提是有 GUI 适用)。

相关内容