【问题标题】:BASH SCRIPT : Code works from terminal but not from rc.localBASH SCRIPT:代码在终端工作,但不能从 rc.local
【发布时间】:2011-08-09 11:13:28
【问题描述】:

我编写了一个小脚本,它可以 ping 一个地址,然后在 ping 返回成功时将设备安装到该地址。该文件位于 Ubuntu Linux 系统上的 rc.local 中。

如果从终端(以 root 身份)运行,它会很好,但不会在启动时从 rc.local 运行。我知道它正在执行,因为 /tmp/buffalo_mount.log 包含“从 rc.local 执行网络设备检测脚本”。有人有什么想法吗?

注意:现在工作!请阅读以下注意事项:-)

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

ADDRESS=192.168.1.101
DATETIME="$(date)"
LOGFILE="/tmp/buffalo_mount.log"

sleep 30s

echo "Executing Network Device Detect Script From rc.local" >> $LOGFILE
    if /bin/ping -c 1 -t 1 $ADDRESS > /tmp/ping 2>&1 ;then  # check the exit code
        echo "$ADDRESS is LIVE  "+$DATETIME >> $LOGFILE # display the output
    # Ping reply was good, so run the mount command.
    echo "Slept, now mounting device" >> $LOGFILE
    /bin/mount /media/Buffalo/Acer-laptop-back_in_time
    else
        echo "$ADDRESS is DEAD  "+$DATETIME >> $LOGFILE
fi

然后我必须编辑“/etc/fstab”文件,以便 fstab 知道挂载,但在上面的脚本使用“noauto”参数告知之前不会挂载.我在 fstab 中的示例是:-

//192.168.1.101/back-in-time/ /media/Buffalo/Acer-laptop-back_in_time cifs **noauto**,guest,uid=1000,iocharset=utf8,codepage=unicode,unicode,_netdev  0  0

真的希望这对某人有所帮助,因为这让我发疯了。感谢所有提供帮助的人。

【问题讨论】:

  • 脚本是否在网络启动前运行?
  • afaik rc.local 应该在所有其他初始化脚本之后运行,因此也在网络启动之后运行。尽管如此:您的日志中是否收到 $ADRESS is DEAD 消息?
  • 没有。我只收到“从 rc.local 执行网络设备检测脚本”消息。虽然 LIVE/DEAD 消息可以从根终端运行。
  • 任何正确的 rc.local 应该是最后运行的脚本列表。

标签: linux bash ubuntu ping


【解决方案1】:

-e 参数要求 sh 如果命令具有非 0 存在状态则退出,因此脚本将停止而不是执行 if 的 else 分支。你应该替换

/bin/ping -c 1 -t 1 $ADDRESS > /dev/null 2> /dev/null  # ping and discard output
if [ $? -eq 0 ] ; then

通过

if /bin/ping -c 1 -t 1 $ADDRESS > /dev/null 2>&1 ; then

【讨论】:

  • 我尝试了你的建议,但结果是一样的,此外,我上面的代码可以在终端上完美运行,而不是来自 rc.local。我的代码检测并报告 ping 的好坏完全没有问题。 rc.local 执行有些奇怪。
  • 如何在命令行运行脚本?它带有 .,这将不会运行新的 shell,因此不会考虑 -e 选项。而且我忘了提到必须删除if之前的ping命令(否则它会在失败时继续停止执行,防止到达if)。
  • OK 'AProgrammer',我使用了你的代码,现在 buffalo_mount.log 显示 Ping 已执行(非常感谢),但我得到了 '192.168.1.101 is DEAD' 行回来。如果我运行“sudo sh /etc/rc.local”命令,它将与“192.168.1.101 is LIVE”一起在日志和驱动器安装中返回。既然 rc.local 是最后一件事要运行的话,那是什么?感谢大家的帮助和耐心,但这很令人沮丧。
  • 记录 ping 的输出而不是将其发送到 /dev/null,它应该会提示您出了什么问题。
  • 得到“网络不可用”。我在脚本顶部附近添加了一个“sleep 30s”(不是最好的方法,确实需要添加行来检测网卡是否已启动)。它现在可以正确检测到 ping(猜测网络仍在运行)。虽然无法安装驱动器。尝试在驱动器安装之前添加睡眠 120 秒,但仍然没有安装。我已经编辑了上面的代码以显示当前文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 2018-11-23
  • 2011-10-06
  • 2015-08-12
  • 1970-01-01
  • 2018-11-30
相关资源
最近更新 更多