# skript frage

## Christian99

Hallo, ich hab mal ne Frage zum skript schreiben (dash oder auch bash, wenn nötig):

ich will ein skript schreiben, das xdm stoppt, das nvidiamodul entläd und neu läd, und xdm wieder startet.

wenn ich das aber unter kde von konsole aus starte wird das laufende skript beendet, sobald X beendet wurde, was ja auch ganz normal ist.

ich kann eine screen session und das skript von dort aus starten. gibt es eine möglichkeit, das im skript zu machen, so das screen gestartet wird und das skript im screen ausgeführt wird?

oder ist es möglich, vom skript aus das skript zu disownen? es gibt ja manche daemons oder Programme, wenn man die von einen xterminal aus startet, gehören sie nicht mehr diesen terminal, also man kann das terminal beenden, ohne das programm zu beenden. geht das auch von einem skript aus?

Schönen dank schon mal

Christian

----------

## Max Steel

Ich würde mir etwas in der Richtung basten:

/usr/local/bin/xrestart

```
#! /bin/sh

screen -S xrestart '/etc/init.d/xdm stop && modprobe -r nvidia && modprobe nvidia && /etc/init.d/xdm start'
```

Und falls das nicht hilft derhier geht bestimmt.

/usr/local/bin/xrestart

```
#! /bin/sh

screen -S xrestart '/usr/local/bin/xrestart-helper'
```

/usr/local/bin/xrestart-helper

```
#! /bin/sh

/etc/init.d/xdm stop && modprobe -r nvidia && modprobe nvidia && /etc/init.d/xdm start
```

Aber an und für sich: man screen kann manchmal helfen  :Wink: 

----------

## py-ro

nohup vor dem Skript sollte auch schon genügen.

Py

----------

## Christian99

hallo, und danke.

die erste methode von max steel hatte ich schon, aber da ich ein paar ifs brauche wollte ich ein "richtiges" skript machen.

hab bei screen noch die Variable $STY gefunden, ich prüfe jetzt, ob die da ist, wenn nicht, wird ein screen gestartet, und das skript da drin nochmal ausgeführt. wenn sie da ist, wird es ganz normal ausgeführt. sieht so aus:

```
# check if we are in the proper screen session

if [ "$(echo $STY | cut -d. -f2)" != "xrestart" ]; then

        screen -d -m -S xrestart "$0"

        exit

fi
```

zu nohup:

klingt auch gut, aber das muss ich vors skript schreiben. gibts auch ne möglichkeit das im skript zu verwenden?

könnte man sowas wie #!/usr/bin/nohup /bin/bash als shebang verwenden?

----------

## py-ro

nein, aber du könntest AFAIK einen {} in der Shell mit nohup verwenden

```
nohup { foo && bar && blub}
```

----------

## mv

Von screen würde ich in dem Zusammenhang abraten: Du will gerade die Features von nohup oder disown, also solltest Du eben die verwenden. Das ist portabler (auf einigen Systemen ist vielleicht tmux statt screen installiert, auf anderen weder noch) und umgeht Schwierigkeiten, die durch die zusätzlichen Features von screen entstehen.

Ansonsten hast Du bei screen das selbe Problem wie bei nohup: Du musst das eigentliche Kommando als Argument übergeben. Da die Kommandos bei Dir kurz sind, ist das simpel:

```
#! /bin/sh

exec nohup '/bin/sh -c "Bla && blub "'
```

Bei längerem Code empfiehlt sich ein kurzes Script, das "nohup langes_script" aufruft. Falls es unbedingt ein File sein soll, kannst Du ja noch einen magischen Parameter übergeben und anhand dessen entscheiden, ob nohup oder das "eigentliche" Script ausgeführt wird (sux beispielsweise macht das so ähnlich zum Wechseln der Rechte).

----------

## schmutzfinger

Ich würde das nicht von Innen (X) sondern eher von Aussen lösen. Dieses Problem habe ich auch schon gehabt. Der Grafiktreiber schmiert ab und nimmt den X-Server mit. Vielleicht sogar zusammen mit der Tastatur und der Maus. Dann hilft nur ssh und den X Server von dort neu starten. Auf einem Notebook kann man das aber zum Beispiel auch über eine Sondertaste lösen, die ein ACPI event schickt. Bei nem Thinkpad sieht ACPI zum Beispiel Fn+F1 aber diese Sondertaste wird normalerweise nicht benutzt und erzeugt auch kein Input-event in X. Auf einem anderen Rechner habe ich so ein script mal mit einer Fernbedienung ausgelöst. Lircd ist auch unabhängig von X und kann bei einem eingefrorenen X-Server noch zur Rettung benutzt werden.

Falls du manchmal auch die Tastatur verlierst solltest du von Anfang an versuchen das script von Aussen starten. Auf nem Desktop kann man heutzutage auch ACPI und den Power-Button für sowas benutzen. Für ACPI siehe zum Beispiel http://www.gentoo.de/doc/de/power-management-guide.xml.

----------

## Christian99

danke noch für die zusätzlichen hinweise, aber die screen Lösung ist für mich völlig hinreichend. ich hab nur einen rechner, auf dem ist screen, und wenn ich mal noch mehr rechner haben sollte, wird da auch screen drauf sein.

@schmutzfinger: ich will eincfach nur ein kleines skript, das einen neuen grafiktreiber läd, weiter nix.

----------

