1

У меня есть сценарий ниже, который, кажется, отлично работает при запуске из командной строки с /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=$1
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.daily.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, на котором я храню резервные копии, не включен и не смонтирован, он спрашивает меня, что я хочу сделать, давая мне возможность включить его до продолжается. Если меня нет рядом, чтобы ответить на сообщение, оно будет повторяться позже.

2 ответа2

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 доступ к вашему серверу.

0

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

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

#!/bin/sh                                                                                                      

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

type=$1                                                                                                        
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).Это решает это, и все это прекрасно работает сейчас.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .