![/etc/rc.local 是在任何(普通)用户登录之前运行脚本的好地方吗?](https://linux22.com/image/64652/%2Fetc%2Frc.local%20%E6%98%AF%E5%9C%A8%E4%BB%BB%E4%BD%95%EF%BC%88%E6%99%AE%E9%80%9A%EF%BC%89%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E4%B9%8B%E5%89%8D%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC%E7%9A%84%E5%A5%BD%E5%9C%B0%E6%96%B9%E5%90%97%EF%BC%9F.png)
我有一个 Ubuntu 14.04 服务器,在启动过程中,它应该在任何普通用户登录(通过 ssh)之前通过网络同步一些内容。
我想知道调用脚本的/etc/rc.local
位置是否正确?
看看这个脚本的评论:
该脚本在每个多用户运行级别结束时执行。
看起来它是在系统准备好接受用户登录后调用的。
这就是我对“每个多用户运行级别结束时”的理解。
我在这里看到了答案:目的和典型用法/etc/rc.local
,我还是觉得有点暧昧。
更新
需要更多的上下文:这是一个自动化过程,用户实际上是许多机器轮询服务器以登录......
答案1
通常/etc/rc.local
是有效的选项,但它也取决于“同步某些内容”所涉及的工作量以及用户在此操作完成之前无法登录的重要性。
如果您想确保同步在用户登录之前完成,您可以考虑两个“nologin”选项之一。
编写一个脚本,将(特定用户组的)登录 shell 设置为
/usr/sbin/nologin
同步前并在同步后恢复。/etc/nologin
在同步之前创建一个空文件touch /etc/nologin
,并在同步后将其删除。请注意,如果您禁用通过 SSH 以 root 身份登录,则此选项可能很容易将您锁定,因为它会阻止所有非 root 帐户登录。
答案2
对于您描述的情况,调用同步脚本/etc/rc.local
是一个有效的解决方案。这也是我可能会选择的解决方案,尽管其他人无疑会提出其他解决方案。
它在所有“内置”rc 启动脚本之后、控制台上出现登录提示之前执行。但请记住,用户将能够在rc.local
运行之前通过 SSH 登录系统。如果这是一个问题,您可以将脚本放在网络启动之后但 SSH 启动之前的启动序列中。我仍然使用rc.local
而不担心移动它的位置的原因是,SSH 守护程序启动和用户意识到系统可用之间的时间很可能远远长于系统到达并执行脚本所需的时间rc.local
。
答案3
看起来它是在系统准备好接受用户登录后调用的。这就是我对“每个多用户运行级别结束时”的理解。
不,/etc/rc.local
系统启动时执行。 (当用户使用 ssh 登录时,它将设置环境并运行脚本/etc/profile
~/.bashrc
,读取这一页了解更多信息。 )
我想知道从 /etc/rc.local 调用脚本是否是正确的地方?
是的你可以
答案4
我个人会采用@John的解决方案,但您也可以设置启动顺序,以便在最开始(靠近S01符号链接)运行以下命令:
echo "Please try to log in later" > /etc/nologin
然后输入/etc/rc.local
:
/root/yourscript.sh
rm -f /etc/nologin
该文件的存在/etc/nologin
会阻止非 root 用户从 SSH 或控制台登录。这将保证用户在脚本完成之前不会登录。