Script auf Remotemaschine gibt Inaktiv zurück

  • Hallo liebe Gemeinde,
    erst mal Hallo und danke an alle die sich an solchen Foren aktiv beteiligen und Neulingen wie mir die Gelegenheit geben ihre Skripte zu verwirklichen.
    Folgendes Problem:
    Ich habe ein Skript geschrieben das ich mit dem Win Taskmanger starte. Dieses soll dann ein Backup über die CMD Line von einer MySQL DB machen. Das Skript an sich funktioniert wunderbar, nur sobald ich mich von dem Server remote abmelde wird das Skript nicht mehr korrekt ausgeführt. Die Prompt wird geöffnet aber der Send Befehl kann nicht abgesetzt werden, da das Fenster inaktiv ist. Wie gesagt, solange ich angemeldet bin klappts. Habe ein Aufruf von WinActivate drin(davon habe ich mir die Lösung versprochen), das Verhalten ist aber leider unverändert. In der Log Datei ist dann zu sehen, dass $activate=0 ist.
    Leider gehen mir die Ideen aus.
    Für weitere Ideen und Anregungen wäre ich sehr dankbar.

    Anbei der Quellcode:


    MFG
    Miagi

  • Ich würde mal behaupten:

    - keine Anmeldung
    - also kein Desktop
    - also auch kein Fenster
    - wie soll also WinActivate ein Fenster auf einem nicht vorhanden Desktop aktivieren ?
    - wie soll also Send etwas an ein nicht vorhandes/aktives Fenster, auf einem nicht vorhandenen Dekstop senden ?

    Gruß
    micha_he

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Probier es doch mal so:

    Spoiler anzeigen
    [autoit]

    ;~ http: / / autoit.de / index.php?page = Thread & threadID = 16700

    [/autoit] [autoit][/autoit] [autoit]

    #include <Date.au3>

    [/autoit] [autoit][/autoit] [autoit]

    FileWrite("C:\Backup\backup.log", @CRLF & _NowCalcDate() & "-" & @HOUR & ":" & @MIN & " --> DOS Prompt wird geöffnet." & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(2000)

    [/autoit] [autoit][/autoit] [autoit]

    FileWrite("C:\Backup\backup.log", _NowCalcDate() & "-" & @HOUR & ":" & @MIN & " --> 2s wurde gewartet." & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ;Umgebung wird erzeugt
    iF _RunDos("set path=%path%;C:\Programme\xampp\mysql\bin") Then
    FileWrite("C:\Backup\backup.log", _NowCalcDate() & "-" & @HOUR & ":" & @MIN & " --> Fehler bei set path" & @CRLF)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    FileWrite("C:\Backup\backup.log", _NowCalcDate() & "-" & @HOUR & ":" & @MIN & " --> Backup wurde gestartet." & @CRLF)
    If _RunDOS("mysqldump -u xxxx -xxxxx Copyright data > C:\Backup\mysql\" & @YEAR & @MON & @MDAY & @MIN & @HOUR & ".sql") Then
    FileWrite("C:\Backup\backup.log", _NowCalcDate() & "-" & @HOUR & ":" & @MIN & " --> Fehler bei mysql dump" & @CRLF)
    EndIf
    FileWrite("C:\Backup\backup.log", _NowCalcDate() & "-" & @HOUR & ":" & @MIN & " --> Backup wurde beendet." & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _RunDOS
    ; Description ...: Executes a DOS command in a hidden command window.
    ; Syntax.........: _RunDOS($sCommand)
    ; Parameters ....: $sCommand - Command to execute
    ; Return values .: Success - the exit code of the command
    ; Failure - 0 and sets @Error to non-zero
    ; Author ........: Jeremy Landes <jlandes at landeserve dot com>
    ; ===============================================================================================================================
    Func _RunDOS($sCommand)
    Local $nResult = RunWait(@ComSpec & " /C " & $sCommand, "", @SW_HIDE)
    Return SetError(@error, @extended, $nResult)
    EndFunc ;==>_RunDOS

    [/autoit]

    Die Send befehle brauchst du doch garnicht, wenn du es über @ComSpec machst. dann werden die consolenbefehle als quasi-parameter direkt an die cmd.exe übermittelt.

  • Erst mal danke für die Antworten.
    @Micha: Könnte man meinen, bin mir da aber nicht ganz sicher, denn das Skript läuft auf einem Windows Server. Der Desktop an sich bleibt aktiv. Ich hab mich da vll. falsch ausgedrückt. Ich melde mich nicht aktiv auf dem Desktop ab, sondern beende nur die Verbindung. Die CMD Line öffnet sich, wird allerdings nicht aktiv.
    Magnus: Dann werd ich mich mal rein lesen. Das wird wahrscheinlich etwas schwieriger sein, als eine einfache Applikation zu schreiben.

    Evtl. kommt da noch die eine oder andere Frage.

    Gruß ,Danke und Guter Rutsch
    Miagi

  • SEuBo: Hab´s grade noch gesehen. Hab deinen Tipp gleich mal ausprobiert. Gar nicht mal schlecht. Zumindest werden jetzt mal die Befehle abgesetzt und auch ein .sql File erzeugt allerdings mit der Größe 0KB. Das wird wohl daran liegen, dass der Befehl ausgeführt wird, aber nicht gewartet wird bis das Backup beendet wurde. Die Datenbank hat immerhin 15 Mil. Einträge. Deswegen hatte ich auch ein langes Sleep() mit eingebaut bevor WinClose abgesetzt wird. Jetzt müsste ich der Funktion nur noch ein Sleep mitgeben, was aber wahrscheinlich die Funktion nicht vorsieht....
    Desweiteren sehe ich ein Problem mit dem Return Value. Bei mysql wird, wie meistens in Linux, bei Erfolg keine Rückmeldung gegeben. Deswegen würde wohl immer eine Fehlermeldung ausgespuckt werden.
    Aber danke werde mal weiterversuchen...

    MFG Miagi

    Edit:
    Bin jetzt etwas verwirrt:
    Die Funktion nutzt ja RunWait: (Wartet diese wirklich bis mein Dump durchgelaufen ist, bzw. bis die Prompt wieder verfügbar ist?)
    "Function RunWaitTo run DOS commands, try RunWait(@ComSpec & " /c " & "commandName") ; don't forget " " before "/c"

    After running the requested program the script pauses until the program terminates. To run a program and then immediately continue script execution use the Run function instead."

    2 Mal editiert, zuletzt von Miagi83 (30. Dezember 2009 um 14:31)