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: Alles auswählen
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()
sleepyhead