Похожие вопросы

скрипт списка сайтов для определения шифров
Нашел скрипт на моем кроне.ежемесячно, мне интересно, что он делает?
Перехват ошибки команды bash в переменной
Какова дата изменения отчетов ls для каталогов в оболочке Bash?
"- bash: ls: команда не найдена " ошибка в терминале на Mac. Как это исправить?
Как подключиться к WiFi из командной строки в Ubuntu без.конф файл?
Awk, но выводить только часть поля
Я добавил новый путь в список путей, но не смог выполнить программу из любого места linux
Как сменить оболочку по умолчанию в Cygwin?
Как chmod все папки рекурсивно исключая все папки в определенной папке?
Запустить скрипт после входа в систему в Linux
Запуск devcon.exe правильно (включение / выключение устройства из командной строки в Windows 10)
Bash скрипты не работают, но на Mac терминала эти команды в скриптах работает
ограничить rsync (или сценарий bash) каталогом
Linux Bash: перемещение / копирование файлов / каталогов по метке времени

Почему xmessage сообщает, что пользователь нажал "x", не отображая сообщение при запуске из cron?

у меня есть скрипт, который, кажется, работает отлично, при запуске из командной строки с /root/.scripts/peter-laptop-backup-launcher.sh daily (он отображает xmessage, спрашивая, что я хочу сделать), но когда он запускается через anacron, он ведет себя по-другому, говоря, что xmessage был отображен, и пользователь нажал " x " в углу, когда на самом деле он, похоже, вообще не отображался.

при запуске из командной строки, он отображает сообщение и действует на выбор пользователя правильно.

сценарий:

#!/bin/sh

# Script to launch the appropriate Backup command to backup My laptop, on condition that the drive is mounted.

type=
action="102"
ip="192.168.0.5"

# Set the display
DISPLAY=peter-aspire-ubuntu:0
export DISPLAY
cp /home/peter/.Xauthority /root/.Xauthority

while [ $action -ne 101 ]
do
        echo "Begin loop"

        echo "Perform ping"
        ping -c 1 $ip

        if [ $? -eq 0 ] ; then

                echo "Machine is giving ping response"
                mount /mnt/NAS > /dev/null 2>&1;

        else
                echo "Machine is not responding to pings"

        fi

        if grep -qs '/mnt/NAS' /proc/mounts; then

                # It's mounted so carry on.
                echo "NAS is mounted"

                if [ "$type" = "daily" ]; then

                        echo "Performing daily backup"
                        nice -n 17 rsnapshot daily
                        echo "Daily backup finished"

                        ## 
                        ##  FINISHED - SWITCH OFF
                        ## 

                        umount -l /mnt/NAS
                        echo "NAS unmounted"
                        ssh root@nas 'poweroff -pih';
                        echo "NAS powered down"
                else
                        echo "Performing $type backup"
                        rsnapshot $type
                        echo "$type backup finished"
                fi

                action="101"

        else

                # It's not mounted so...
                  # 101 = "Cancel"
                  # 102 = "Try again"
                  # 1   = User clicked the 'X'
                  # 0   = Timeout occured

                echo "Displaying xmessage"

                xmessage -buttons "Cancel","Try again","Snooze 30min","Snooze 1hr" -default "Try again" -center -timeout 1200 "The NAS is not mounted and your $type backup is due to run."

                action=$?
                echo "xmessage signal was = $action"

                if [ $action -eq 0 ] ; then
                        echo "User clicked 'Try again'"
                        action="102"
                fi

                if [ $action -eq 1 ] ; then
                        echo "User clicked 'x'"
                        action="101"
                fi

                if [ $action -eq 103 ] ; then
                        echo "Snooze for 30m"
                        sleep 30m
                        # Set "Try again"
                        action="102"
                fi

                if [ $action -eq 104 ] ; then
                        echo "Snooze for 1hr"
                        sleep 1hr
                        action="102"
                fi

                echo "final adjusted = $action"

        fi
        echo "End of loop"
done

Это запись в /etc/anacrontab

1       4       rsnapshot.daily /root/.scripts/peter-laptop-backup-launcher.sh daily > /var/log/backup/rsnapshot.daily.log

это то, что регистрируется в /rsnapshot.ежедневный.log

Begin loop
Perform ping
PING 192.168.0.5 (192.168.0.5) 56(84) bytes of data.
From 192.168.0.8 icmp_seq=1 Destination Host Unreachable

--- 192.168.0.5 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

Machine is not responding to pings
Displaying xmessage
xmessage signal was = 1
User clicked 'x'
final adjusted = 101
End of loop

это вывод в терминале при запуске из командной строки:

Begin loop                                                                                                     
Perform ping                                                                                                   
PING 192.168.0.5 (192.168.0.5) 56(84) bytes of data.                                                           
From 192.168.0.8 icmp_seq=1 Destination Host Unreachable                                                       

--- 192.168.0.5 ping statistics ---                                                                            
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms                                       

Machine is not responding to pings                                                                             
Displaying xmessage
{after this the result depends on what you choose and behaves as expected}

цель скрипта-запускать резервную копию rsnapshot каждый день, но если мой NAS, который я использую для хранения резервных копий, не включен и не смонтирован, он спрашивает меня, что я хочу сделать, давая мне возможность включить его раньше продолжающийся. Если меня нет рядом, чтобы ответить на сообщение, повторите попытку позже.

5
задан Peter Snow
источник

2 ответов

код xmessage не может отображаться как anacron не имеет разрешения на запись на X-дисплей; возвращает 1 при ошибке; с man-страницы:

EXIT STATUS
       If it detects an error, xmessage returns 1, so this value should not be
       used with a button.

вы нужно установить DISPLAY=:0 разрешить команды X внутри anacron для доступа к серверу.

2
отвечен Patrice Levesque 2013-05-26 14:31:07
источник

Я, наконец, получил эту работу с помощью этой теме.

исправленный скрипт:

#!/bin/sh                                                                                                      

# Script to launch the appropriate Backup command to backup My laptop, on condition that the drive is mounted. 

type=                                                                                                        
action="102"                                                                                                   
ip="192.168.0.5"                                                                                               

# Set the display                                                                                              
export DISPLAY=:0                                                                                              
xauth merge /var/lib/kdm/:0.Xauth                                                                              

while [ $action -ne 101 ]                                                                                      
do                                                                                                             
        echo "Begin loop"                                                                                      
        date                                                                                                   

        echo "Perform ping"                                                                                    
        ping -c 1 $ip                                                                                          

        if [ $? -eq 0 ] ; then                                                                                 

                echo "Machine is giving ping response"                                                         
                mount /mnt/NAS > /dev/null 2>&1;                                                               

        else                                                                                                   
                echo "Machine is not responding to pings"

        fi

        if grep -qs '/mnt/NAS' /proc/mounts; then

                # It's mounted so carry on.
                echo "NAS is mounted"

                if [ "$type" = "daily" ]; then

                        echo "Performing daily backup"
                        nice -n 17 rsnapshot daily
                        echo "Daily backup finished"

                        ## 
                        ##  FINISHED - SWITCH OFF
                        ## 

                        umount -l /mnt/NAS
                        echo "NAS unmounted"
                        ssh root@nas 'poweroff -pih';
                        echo "NAS powered down"
                else
                        echo "Performing $type backup"
                        rsnapshot $type
                        echo "$type backup finished"
                fi

                action="101"

        else

                # It's not mounted so...
                  # 101 = "Cancel"
                  # 102 = "Try again"
                  # 1   = User clicked the 'X'
                  # 0   = Timeout occured

                echo "Displaying xmessage"

                xmessage -buttons "Cancel","Try again","Snooze 30min","Snooze 1hr" -default "Try again" -center -timeout 1200 -display :0 "The NAS is not mounted and your $type backup is due to run."

                action=$?
                echo "xmessage signal was = $action"

                if [ $action -eq 0 ] ; then
                        echo "User clicked 'Try again'"
                        action="102"

                elif [ $action -eq 1 ] ; then
                        echo "User clicked 'x'"
                        action="101"

                elif [ $action -eq 103 ] ; then
                        echo "Snooze for 30m"
                        sleep 30m
                        # Set "Try again"
                        action="102"

                elif [ $action -eq 104 ] ; then
                        echo "Snooze for 1hr"
                        sleep 1hr
                        action="102"
                fi

                echo "final adjusted = $action"

        fi
        echo "End of loop"
done

ключ это строка xauth merge /var/lib/kdm/:0.Xauth, который копирует текущее разрешение " x " пользователей для записи на его дисплей в этот файл xauthority пользователей.

предыдущие решения работали из командной строки, запускаемой от имени root, но не тогда, когда скрипт запускался anacron (также запускался от имени root).Это решает, что и все работает отлично теперь.

0
отвечен Peter Snow 2013-05-29 04:29:31
источник

Другие вопросы bash bash-scripting kubuntu linux ubuntu