BASH SCRIPT: код работает с терминала, но не с rc.local - PullRequest
1 голос
/ 09 августа 2011

Я написал небольшой скрипт, который пингует адрес, а затем монтирует устройство по этому адресу, если пинг вернулся успешно.Файл находится в rc.local в системе Ubuntu Linux.

Он прекрасно работает, если запускается из терминала (как 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

Действительно надеюсь, что это поможет кому-то, потому что это сводило меня с ума.Спасибо всем, кто помог.

1 Ответ

6 голосов
/ 09 августа 2011

Аргумент -e просит sh выйти, если команда имеет не существующий статус 0, поэтому сценарий остановится вместо выполнения ветви else вашего if.Вам следует заменить

/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
...