• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[Gelöst] Einfaches Script nach dem Booten starten

Jetzt habe ich eine Weile gegoogelt und bin irgendwie nicht schlau geworden. Ich möchte vor dem login ein script starten, daß lediglich überprüft, ob eine bestimmte Datei vorhanden ist, falls nicht vorhanden, soll diese erzeugt werden. D.h. ich will kein Programm o.ä. starten. Muß ich dazu ein init-script verwenden? In dem Fall könnte ich /etc/init.d/skeleton als Vorlage verwenden, nur so kompliziert wollte ich die Sache nicht machen, falls möglich.

CU Freddie
 

RME

Advanced Hacker
Hallo,

Für 11.4 (oder älter):

Code:
/etc/init.d/before.local
oder

Code:
/etc/init.d/boot.local
(ob dies auch für 12.1 gilt weiss ich nicht)

Gruss,
Roland
 
OP
F

Freddie62

Guru
Ist noch 11.4 und wird erst mal auch so bleiben. Ich nehme mal an, daß es reicht, einfach mein script in dieses File zu schreiben oder muß ich den Runlevel zusätzlich angeben, also am Anfang z.B. Runlevel --3? Auf jeden Fall muß die RAM-Disk bereits aktiv sein, da das File dort angelegt wird.

CU Freddie
 

RME

Advanced Hacker
Hallo Freddie,

Wenn Du in der Datei

Code:
/etc/init.d/boot.local
Folgenden Code einfügst

Code:
touch /home/user0/newfile.txt
echo "this is a test" > /home/user0/newfile.txt
dann hast Du nach dem Boot eine Datei "/home/user0/newfile.txt" mit dem geschriebenen Text.

Gruss,
Roland
 
OP
F

Freddie62

Guru
Ich hatte ein Testscript geschrieben, das zunächst prüft, ob die Datei btmp in /var/log existiert. Falls sie nicht existiert, wird eine leere Datei in /var/log erzeugt. Das Script funktioniert. Dieses Script ist bei einem meiner Rechner notwendig, damit man sich notfalls im RL3 anmelden kann. Falls diese Datei fehlt, wird bei der Anmeldung der Fehler "Fehler im Service-Modul" ausgegeben und man ist wieder am Login. :down:
Das werde ich gleich so einfügen und testen.

CU Freddie
 

josef-wien

Ultimate Guru
Gehörst Du zu jenen Leuten, bei denen /var/log nur temporär ist, und die auf dauerhafte Log-Dateien verzichten?

Eine "RAM-Disk" realisiert man üblicherweise als tmpfs in der fstab, damit ist sie bei der Ausführung von boot.local (wird einmalig am Ende von /etc/init.d/boot ausgeführt) bereits vorhanden. Nach /etc/init.d/boot und bei jeder Änderung des runlevel kommt /etc/init.d/rc an die Reihe (und führt am Anfang before.local und am Ende after.local aus).
 
OP
F

Freddie62

Guru
Ich gehöre normalerweise nicht zu diesen Leuten, habe mir aber eine Zotac ZBOX AD02 mit SSD zugelegt. Um die Anzahl der Schreibzugriffe auf die SSD zu reduzieren, habe ich, unter Anderem, /var/log in eine RAM-Disk gelegt.

CU Freddie
 

abgdf

Guru
Code:
/etc/init.d/boot.local
ist bestimmt kein schlechter Platz. Ich führe aber auch ein paar Sachen direkt vor Runlevel 3 aus. Da gibt es in der Datei
Code:
/etc/rc.d/rc
einen Abschnitt
Code:
# For the first logon on a virtual console.
Dahinter habe ich meine Sachen hingeschrieben. Funktioniert bei mir recht gut.

Gruß
 
OP
F

Freddie62

Guru
So, jetzt habe ich das Ganze mal ausprobiert. Das Script selbst funktioniert, jedoch wird es entweder zu früh oder gar nicht ausgeführt, da die Datei definitiv nicht existiert. Das funktioniert weder in /etc/rc.d/rc noch in /etc/init.d/boot.local. :???:

CU Freddie
 

RME

Advanced Hacker
...entweder zu früh oder gar nicht...
Komisch!

Du könntest mal vor sowie nach Deinem Code noch folgendes einfügen:

Code:
logger "mein Code Anfang"

...Dein Code...

logger "mein Code Ende"
"logger" schreibt ins "/var/log/messages" welches Du dann überprüfen kannst.

Gruss,
Roland
 

abgdf

Guru
Freddie62 schrieb:
Das funktioniert weder in /etc/rc.d/rc noch in /etc/init.d/boot.local.
Ich würde - anstatt eines Skripts - in "/etc/rc.d/rc" einfügen:
Code:
#
# For the first logon on a virtual console.
#

YOURFILE="/your/file/name"

if test ! -f "$YOURFILE"; then
    touch "$YOURFILE"
fi
Den Wert für YOURFILE entsprechend anpassen.
 
A

Anonymous

Gast
Freddie62 schrieb:
So, jetzt habe ich das Ganze mal ausprobiert. Das Script selbst funktioniert, jedoch wird es entweder zu früh oder gar nicht ausgeführt, da die Datei definitiv nicht existiert. Das funktioniert weder in /etc/rc.d/rc noch in /etc/init.d/boot.local. :???:
/etc/rc.d/rc ist ein Masterscript. wenn möglich die Finger davon lassen.
/etc/init.d/boot.local könnte eventuell geeignet sein, das könnte aber uU ein wenig früh sein. Kommt darauf an was du da genau für ein Ramdisk zusammen konfiguriert hast.
Wenn es in der boot.local nicht funktioniert, ist die nächste Wähl wirklich ein eigenes Startscript.

Code:
### BEGIN INIT INFO
# Provides:          btmp
# Required-Start:    $syslog 
# Should-Start:      
# Required-Stop:     
# Should-Stop:       
# Default-Start:     1 2 3 5
# Default-Stop:     
# Short-Description: check /var/log/btmp
### END INIT INFO

case "$1" in
    start)
        echo -n "checking /var/log/btmp "
        ## Hier kommt jetzt deine paar Befehlszielen, 
        ## dran denken das hier mit kompletten Pathnamen gearbeitet werden sollte. 
        ## im einfachsten Fall reicht vollkommen aus
       touch  /var/log/btmp
        ;;
    stop)
        ;;
esac
das als /etc/init.d/btmp speichern
als root Ausführungsrechter drauf setzten "chmod u+x btmp"
und das Startscript dann scharf schalten
Code:
insserv btmp

fertig ist das Startscript.

robi
 

abgdf

Guru
josef-wien schrieb:
abgdf schrieb:
Da gibt es in der Datei /etc/rc.d/rc ...
/etc/init.d/after.local ist die bessere Lösung.
Wahrscheinlich. War halt so, daß ich mal den Login-Text (auf der Konsole, nicht kdm oder so) ändern wollte und das mit Änderungen in der ".../rc"-Datei ganz gut geklappt hat. Wen's interessiert, das sieht bei mir jetzt ungefähr so aus:
Code:
#
# For the first logon on a virtual console.
#

if test "$RUNLEVEL" = "3"; then

    echo > /etc/issue
    echo "Welcome to SUSE LINUX 10.0 (i586) - Kernel \r (\l)." >> /etc/issue
    echo >> /etc/issue
    date +%d.%m.%Y," "%R" Uhr". >> /etc/issue
    echo >> /etc/issue
    echo >> /etc/issue

    clear
fi
 
OP
F

Freddie62

Guru
Code:
Kueche:/etc/init.d # cat boot.local
#! /bin/sh
#
# Copyright (c) 2002 SuSE Linux AG Nuernberg, Germany.  All rights reserved.
#
# Author: Werner Fink, 1996
#         Burchard Steinbild, 1996
#
# /etc/init.d/boot.local
#
# script with local commands to be executed from init on system startup
#
# Here you should add things, that should happen directly after booting
# before we're going to the first run level.
#
f test -f /var/log/btmp

then

   echo "Datei vorhanden"
   
   else
      
         touch /var/log/btmp
            
            fi
Sowie die fstab (Hier ist die Ramdisk angelegt):
Code:
cat fstab
/dev/disk/by-id/ata-Corsair_Force_3_SSD_11376506000010680496-part1 swap                 swap       defaults,noatime              0 0
/dev/disk/by-id/ata-Corsair_Force_3_SSD_11376506000010680496-part2 /                    ext4       acl,user_xattr,nodiratime,discard,noatime     1 1
/dev/disk/by-id/ata-Corsair_Force_3_SSD_11376506000010680496-part3 /home                ext4       acl,user_xattr,nodiratime,discard,noatime     1 2
proc                 /proc                proc       defaults              0 0
sysfs                /sys                 sysfs      noauto                0 0
debugfs              /sys/kernel/debug    debugfs    noauto                0 0
usbfs                /proc/bus/usb        usbfs      noauto                0 0
devpts               /dev/pts             devpts     mode=0620,gid=5       0 0
tmpfs               /tmp                  tmpfs      defaults,noatime,mode=1777          0 0
tmpfs               /var/log              tmpfs      defaults,noatime,mode=1777          0 0

Edit: Ich habe das gerade mit Robi's init-Script ausprobiert. Jetzt funtioniert das Ganze wie gewünscht. Vielen Dank an Robi!
Damit werde ich mich wohl mal auseinandersetzen müssen, ebenso wie mit Scripten...

CU Freddie
 

josef-wien

Ultimate Guru
Freddie62 schrieb:
f test -f /var/log/btmp
Fehlt das i vor dem f wirklich? Ansonsten wird wohl das Verzeichnis /var/log/ zu diesem Zeitpunkt noch nicht angelegt worden sein (/var/ existiert auf jeden Fall), d. h. Du müßtest es vor dem touch erstellen (das Skript von robi setzt voraus, daß der jeweilige syslog daemon bereits läuft).
 
OP
F

Freddie62

Guru
Sch...ade eigentlich! :eek:ps:
Hab ich glatt beim Kopieren und Einfügen übersehen. Asche auf mein Haupt!
Nun ja. das Initscript funktioniert und ich kann mich im Notfall auf der Konsole einloggen.

CU Freddie
 
A

Anonymous

Gast
Freddie62 schrieb:
Nun ja. das Initscript funktioniert und ich kann mich im Notfall auf der Konsole einloggen.

trotzdem noch mal in die Manpage von mount schauen was dort bei tmpfs zu lesen ist. Sicherlich man kann sich darüber streiten ob es Sinn macht den Speicher für sowas einzusetzen, dazu gab es wohl schon hier und da genügend Diskussionen , aber gleich ein Maximum von 2 x 50% vom Speicher für tmpfs für tempoäre Dateien :???: na einen bösenartigen User darfst du da jedenfalls nicht als Untermieter auf dein System lassen - egal wie dick du dir den Speicher ausbaust ;)

robi
 
OP
F

Freddie62

Guru
Mach ich auf jeden Fall, sobald ich ein bißchen Zeit habe (Nächste Woche). Dann werde ich mir mal die Man-Pages zu Gemüte führen. Den Speicher werde ich ohnehin aufstocken, da zur Zeit nur ein Modul (4GB) verbaut ist. Allerdings ist der Rechner ohnehin nicht so oft an.

CU Freddie
 

josef-wien

Ultimate Guru
In der Kernel-Dokumentation findest Du schneller, was Du suchst. Ich sehe das in der Praxis nicht so dramatisch wie robi. Natürlich ist ein auf den voraussichtlichen Platzbedarf beschränktes tmpfs sicherer, aber auch mit der Standard-Beschränkung bemerkst Du einen "böswilligen /tmp-Vollschreiber" viel eher als bei /tmp auf einer Partition. Wenn Du allerdings mehrere tmpfs-Instanzen verwendest, und alle vollgeschrieben werden, reicht irgendwann der Platz auf der SWAP-Partition nicht mehr aus, und dann ist ein Griff zur Reset-Taste notwendig.
 
Oben