Aktuelle Zeit: 25.05.2013 05:00

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Control + C an mit RunProgram() geöffnetes Programm senden
BeitragVerfasst: 07.10.2011 22:55 
Offline

Registriert: 31.01.2006 01:03
Wohnort: Mettendorf TG (Schweiz)
Hallo,

Ich bin darauf und daran eine Festplatte wiederherzustellen, bei welcher immer wieder die Kommunikation zusammenbricht, beziehungsweise /dev/sdb verloren geht. Nachdem /dev/sdb verloren geht, beendet sich dd_rescue leider nicht, sondern meldet einfach für jeden weiteren Block einen Fehler. Mit Control + C kann ich es manuell stoppen und es schreibt das Log fertig. Wenn ich es mit RunProgram() in Purebasic ausführe, kann ich es mit KillProgram() beenden, allerdings schreibt es in diesem Fall die Logdatei nicht fertig und meine letzte Position ist so nicht vermerkt. Folgendes habe ich ausprobiert, um es schön zu beenden, allerdings wird das "^C" leider nicht als Control + C erkannt. Gibt es eine Möglichkeit dem Programm anders mitzuteilen, dass es sich beenden soll? Folgend der ganze Code:

Code:
InitNetwork()

Procedure.s getLastPos()
  ; Liest die letzte Position aus dem Logfile aus
  Dim arrFound.s(1)
  If ReadFile(0, "/home/sleepyhead/400gb.log")
    FileSeek(0, Lof(0)-1000)
    fountIt = 0
    Repeat
      Text$ = ReadString(0)
      If FindString(Text$, "ipos:") And FindString(Text$, ", opos:")
        If CreateRegularExpression(0, "[0-9]+\.[0-9]k")
          ExtractRegularExpression(0, Text$, arrFound())
          FreeRegularExpression(0)
        Else
          PrintN("Error: "+RegularExpressionError())
        EndIf
        lastPos$ = arrFound(0)
        fountIt = 1
      EndIf
      Delay(1)
    Until fountIt = 1 Or Eof(0)
    CloseFile(0)
  EndIf
  If lastPos$ = "" : lastPos$ = "0.0k" : EndIf
  ProcedureReturn  lastPos$
EndProcedure

OpenConsole()

; Prüft und mounted gegebenfalls /mnt/transfer, wo das dd-File hin soll
If ReadFile(0, "/mnt/transfer/400gb.dd")
  CloseFile(0)
Else
  RunProgram("mount", "/mnt/transfer", "/usr/bin/" ,#PB_Program_Wait)
  If ReadFile(0, "/mnt/transfer/400gb.dd")
    CloseFile(0)
    PrintN("/mnt/transfer mounted!")
  Else
    PrintN("Can't mount /mnt/transfer!")
    End
  EndIf
EndIf

MyDD = RunProgram("dd_rescue", "-s "+getLastPos()+" -l /home/sleepyhead/400gb.log -o /home/sleepyhead/400gbBB.log /dev/sdb /mnt/transfer/400gb.dd", "/home/sleepyhead", #PB_Program_Open|#PB_Program_Read|#PB_Program_Write)

If IsProgram(MyDD)
  Repeat
    If ProgramRunning(MyDD)
      If ReadFile(0, "/dev/sdb") = 0
        ; hier versuche ich erfolglos das Programm zu beenden
        WriteProgramStringN(MyDD, "^C")
        While ProgramRunning(MyDD)
          Delay(1)
        Wend
        CloseProgram(MyDD)
        ; Danach wird über ein Netzwerkschalter der Strom zur Festplatte für fünf Sekunden unterbrochen
        ReceiveHTTPFile("http://192.168.6.9/ips.cgi?pg=ips&Aus=Aus", "~/lastipsstate")
        Delay(5000)
        ReceiveHTTPFile("http://192.168.6.9/ips.cgi?pg=ips&Ein=Ein", "~/lastipsstate")
        ; Sobald die Festplatte wieder sichbar ist, führe ich erneut dd_rescue aus
        Repeat
          Delay(1000)
        Until ReadFile(0, "/dev/sdb")
        CloseFile(0)
        MyDD = RunProgram("dd_rescue", "-s "+getLastPos()+" -l /home/sleepyhead/400gb.log -o /home/sleepyhead/400gbBB.log /dev/sdb /mnt/transfer/400gb.dd", "/home/sleepyhead", #PB_Program_Open|#PB_Program_Read|#PB_Program_Write)
      Else
        CloseFile(0)
      EndIf
    Else
      PrintN("dd_rescue not running!")
      CloseConsole()
      End
    EndIf
    Delay(1)
  ForEver
EndIf

CloseConsole()


Gruss
sleepyhead


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Control + C an mit RunProgram() geöffnetes Programm send
BeitragVerfasst: 08.10.2011 17:16 
Offline
Benutzeravatar

Registriert: 29.08.2004 20:11
Wohnort: Schweiz
Wie wär's mit
Code:
system_("kill -2 "+str(pid))
?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Control + C an mit RunProgram() geöffnetes Programm send
BeitragVerfasst: 08.10.2011 19:41 
Offline
PureBasic Team

Registriert: 29.08.2004 00:20
Wohnort: Furtwangen
Oder direkt:
Code:
kill_(ProgramID(MyDD), 2)


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Control + C an mit RunProgram() geöffnetes Programm send
BeitragVerfasst: 09.10.2011 11:54 
Offline

Registriert: 31.01.2006 01:03
Wohnort: Mettendorf TG (Schweiz)
Vielen Dank für eure Antwort remi_meier und freak. Die direkte Methode von freak habe ich nun im Programm integriert und die läuft perfekt. :)


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye