Switch για ακύρωση reboot/shutdown όταν τρέχει προκαθορισμένο process

George Notaras gnot at g-loaded.eu
Tue Nov 25 19:45:31 EET 2008


Nikos Kavourinos wrote:
> George Notaras wrote:
>> Αυτό που ζητάω είναι:
>>
>> 1) Όταν στο PC ξεκινάει ένα συγκεκριμένο process A (πχ ένα backup job
>> μέσω cron), να δημιουργείται ένα αρχείο, πχ /var/lock/tonpoulo.lock.
>> Εύκολο, με τη χρήση ενός loader script για το process A, το οποίο θα
>> δημιουργεί το αρχείο.
>>
>> 2) Με βασική προϋπόθεση να _μην_ πειράξουμε κάποιο core αρχείο του
>> λειτουργικού, πώς θα γίνει το σύστημα, όταν εκτελούνται εντολές όπως
>> shutdown/reboot, να ελέγχει την ύπαρξη του αρχείου
>> /var/lock/tonpoulo.lock και σε περίπτωση ύπαρξής του να μην εκτελεί τη
>> διαδικασία shutdown;
>>
>> Υπάρχει κάποιος μηχανισμός που να δίνει αυτή τη δυνατότητα; Κι αν δεν
>> γίνεται σε επίπεδο initscripts, τα διάφορα γνωστά desktops (kde, gnome,
>> xfce) έχουν κάποιο τέτοιο μηχανισμό που να μπορεί κανείς να προσθέσει
>> ελέγχους σαν τον παραπάνω;
>>
>>
>> -- 
>> linux-greek-users mailing list -- http://lists.hellug.gr
> 
> πιθανοτατα κατι σαν
> 
> if [ -e /var/lock/tonpoulo.lock ]
> then echo `date` shutdown attempt aborted >> /var/log/syslog
> else
> 
> ..... contents of init script for run level 6
> 
> fi
> 
> στη θεση του rc.6 script σου να κανει τη δουλεια
> 

Thanks, αλλά προσπαθώ να αποφύγω την τροποποίηση κάποιου αρχείου που
μπορεί να αλλάξει μετά από μια αναβάθμιση κάποιου πακέτου.

Τελικά διαπίστωσα ότι πλέον χρησιμοποιείται κάποιος νέος μηχανισμός,
ονόματι upstart, ο οποίος έχει κάποια configuration files στο
/etc/event.d/. Για παράδειγμα για το rc6 είναι:

==================
start on runlevel 6

stop on runlevel

console output
script
        set $(runlevel || true)
        if [ "$2" != "0" ] && [ "$2" != "6" ]; then
            set $(runlevel --set 6 || true)
        fi

        if [ "$1" != "unknown" ]; then
            PREVLEVEL=$1
            RUNLEVEL=$2
            export PREVLEVEL RUNLEVEL
        fi

        exec /etc/rc.d/rc 6
end script
===========================


Έκανα μια δοκιμή στα γρήγορα:

touch /var/log/noshutdownreboot.lock

και τροποποίησα το παραπάνω αρχειο ως εξής:


================================================
start on runlevel 6

stop on runlevel

console output
script

        # ****************
        if [ -f /var/log/noshutdownreboot.lock ] ; then
                logger -t rebootdog reboot prevented
                exit 0
        fi
        # ****************

        set $(runlevel || true)
        if [ "$2" != "0" ] && [ "$2" != "6" ]; then
            set $(runlevel --set 6 || true)
        fi

        if [ "$1" != "unknown" ]; then
            PREVLEVEL=$1
            RUNLEVEL=$2
            export PREVLEVEL RUNLEVEL
        fi

        exec /etc/rc.d/rc 6
end script
=======================================


Στη συνέχεια, δίνοντας "reboot" πέφτει ο Χ και το σύστημα μένει σε μια
οθόνη όπου φαίνεται ότι έστειλε το μήνυμα "the system is going to
reboot", αλλά μετά τίποτα. Προφανέστατα φταίει η "exit 0" που έβαλα
παραπάνω. Μόνο με hard reset επανήλθε το σύστημα.

Όλα δείχνουν ότι πριν εκτελεστούν οι εντολές ανάμεσα στα "script" και
"end script" έχει εκτελεστεί κάτι άλλο. Θα πρέπει να διαβάσω το
documentation του upstart, γιατί όλα όσα δοκίμασα ήταν στην τύχη.




More information about the Linux-greek-users mailing list