Hazel und Apple-Skript zum Auswerfen von SD-Card

msg

msg

Aktives Mitglied
Thread Starter
Dabei seit
31.07.2005
Beiträge
1.975
Reaktionspunkte
32
Hallo Leute,

ich komm bei Hazel nicht weiter und bitte euch um Hilfe bei der Umsetzung.
Ein bestimmter Ordnerinhalt soll auf SD-Card abgeglichen werden.
Abschließend würd ich gern die Card auswerfen lassen - das Skript ist bereits vorhanden, aber wie gestalte ich den Auswurf?
Hier ist der Kopier- bzw. Move-Befehl von Hazel:
Bildschirmfoto 2021-08-27 um 14.28.05.png

Ich habe zuerst mal das Applescript hintendrin gesetzt, aber da kam eine solche Fehlermeldung:

Bildschirmfoto 2021-08-27 um 14.25.26.png

Scheinbar bezieht er das Skript auf die behandelte Datei (die *OhneTitel.rtf* ist nur ein Dummy, um das Auslösen des Skripts zu beobachten), aber ich will ja die Card auswerfen, nicht das Skript auf eine Datei anwenden!

Ich dachte, ich lös das, indem ich die SD-Card als zu beobachtender Ordner bei Hazel angebe, und das Skript laufen lasse, aber da kommt das Gleiche an Meldung (nur bezogen auf die bewegte Datei!) ... nur mit der Bedingung für die Aktion hatsche ich etwas: bitte auch da um Unterstützung, was man da am besten nimmt..

A propos - das Skript sieht so aus:
Code:
display alert "SD-Card auswerfen?" buttons {"No", "Yes"}
if button returned of result = "No" then
    display alert "No was clicked"
else
    if button returned of result = "Yes" then
        eject("CNC 3018")
    end if
end if

Hat wer ne Idee, wie man das umsetzen kann? Also nach dem Bewegen des Inhalts Card auswerfen, d.h. Skript auslösen.
Vielen Dank im Voraus!
 
Du hattest doch schon mal selbst eine Lösung in einem anderen Thread dafür gepostet:

sodala, hier ist es!
Code:
display alert "MZ-32 auswerfen?" buttons {"Nein", "Ja"}
if button returned of result = "Nein" then
    display alert "Abbruch"
else
    if button returned of result = "Ja" then
        display alert "Jawoll!"
        tell application "Finder" to eject disk "MZ-32"
    end if
end if
 
ja, es war nur das Skript, das per se funktionierte, isoliert von einem Kontext ...
Jetzt gehts um den Ablauf!
 
Achso, also Hazel macht das Problem, wenn es seine Aufgabe erledigt hat und dann das Skript aufruft.
 
Wie hast du das Script gespeichert?
Das .rtf schreit ja nach Textedit und kein reiner Text.
 
das RTF-File ist nur ein Auslösedummy in einem Testszenario!! Also, "wenn das RTF auf dem Desktop landet, dann .... " soll er das Skript auslösen!
Bitte nicht irritieren lassen!
Der Skript-Befehl wird über "Run Apple-Skript" ausgelöst, eingesetzt per copy&paste
 
Watch folder wäre ja ok, aber das sollte ja schon bei der ersten Datei triggern und abbrechen weil die Karte in Benutzung ist.
Kannst nicht einfach in dem Ablauf als Schritt nach dem Kopieren einfügen.
 
Warum so kompliziert? Via shell script müsste das doch bedeutend leichter gehen:
  • Der auszuführende Befehl lautet "umount /Volumes/<Name des Volumes>"
  • Das ganze musst du per sudo aufrufen, daher am besten in ein Skript packen
  • Anschließend in /etc/sudoers.d eine Datei mit passenden Eintrag ablegen der deinem Benutzer das Ausführen dieses einen Skripts mit root-Rechte und ohne Passwort erlaubt: username ALL=(ALL) NOPASSWD: /pfad/zum-skript/skript
In Hazel kannst du als letzte Aktion dann "Run shell script" auswählen, dort wählst du dann einfach "embedded script" und fügst ein "sudo /pfad/zum-skript/skript" - fertig. Das hat dann absolut keinerlei Bezug zum beobachteten Verzeichnis oder zur beobachteten Datei.
 
@mj

Das Ganze ist nicht so einfach. Ich habe Hazel mittlerweile so weit dass sie meine Bilder auf die verwendeten Objektive scannt (ja, ich hab viele Analoge), die dementsprechenden Daten mittels Exiftool ergänzt und in einem weiteren Schritt im Zusammenhang mit dem Exiftool den Dateinamen auf die Aufnahmedaten (Zeit) ändert, diese am Zielort einsortiert und zeitgleich die Dateien von meiner SD-Karte löscht.

Nur den letzte Schritt, das auswerfen der SD-Card, hab ich noch nicht geschafft. Wenn Du hier einen Tipp hättest..

P.S.: das auswerfen ist kein Problem, nur das Erkennen dass die SD-Card (fast) leer ist.
 
Wie das Auswerfen selbst funktionieren könnte habe ich ja schon oben beschrieben. Aber ich muss zugeben so richtig habe ich deinen Workflow und dein Problem noch nicht verstanden. Was hat das Erkennen, ob eine SD-Karte (fast) leer ist mit dem Auswerfen derselbigen zu tun? Ich glaube, du musst das nochmal näher erläutern 🤷‍♂️
 
Gerne:
1. Hazel verschiebt nach mounten der SD die Fotos in ein anderes Verzeichnis
2. dort durchlaufen die Fotos eine Filterkaskade in welcher die passenden Parameter definiert werden und zum Schluss werden die Fotos an ein anderes Volume weitergegeben
3. dort wird mittels Exiftool der Dateiname in "Y-M-D H.M.S" umgewandelt und auch die Tatsache dass in einer Sekunde mehr als eine Aufnahme erfolgt sein könnte, berücksichtigt
4 Hazel sortiert die Fotos nach dem Datum ein, also Jahr/Unterverzeichnis/Monat+Tag
5. und nun sollte Hazel die SD, welche bis auf ein paar Bytes leer ist, auswerfen. Aber Hazel stört sich anscheinend an den paar übriggebliebenen Bits. Ich konnte sie bisher nicht überreden die SD trotzdem auszuwerfen.
 
Wie genau hast du die Erkennung ob der Datenträger leer ist oder nicht denn implementiert?
 
Tut mir leid, ich sitze momentan nicht am Mac, habe nur das iPad zur Hand.
Ich habe Hazel so konfiguriert dass sie einen belegten Space von sagen wir mal 1 MB ignoriert obwohl die leeren Verzeichnisse von DCIM und Co. im leeren Zustand bei weitem nicht mehr so viel Platz belegen.
 
Zuletzt bearbeitet:
Hmm.. ist auch nicht wichtig, es liegt nicht daran. Ich hab es eben mal getestet und es funktioniert nicht weil Hazel das Volume offen hält während es läuft. Damit lässt es sich nicht unmounten. Ich hab das eben mal mit einem USB-Stick getestet und mir STDERR des umount-Befehls in eine Datei umgeleitet.

Screen Shot 2021-08-27 at 4.48.08 PM.png

Der Hazel-Workflow verschiebt einfach die PNG-Datei vom USB-Stick (/Volumes/USB) in mein Home-Verzeichnis und führt anschließend den umount aus. Der Fehler ist eindeutig.

Hazel.log:
Code:
2021-08-27 16:45:23.210 hazelworker[27579] Running worker (v5.0.7) for folder with identifier: 16777237-2.
2021-08-27 16:45:23.211 hazelworker[27579] ###main load address: 0x100edc000
2021-08-27 16:45:23.211 hazelworker[27579] ###Hazel Core load address: 0x100f18000
2021-08-27 16:45:23.211 hazelworker[27579] ###Noodle load address: 0x101048000
2021-08-27 16:45:23.211 hazelworker[27579] ###CK load address: 0x100ff0000
2021-08-27 16:45:23.230 hazelworker[27579] Processing folder USB
2021-08-27 16:45:25.282 hazelworker[27579] Screen Shot 2021-08-27 at 11.58.31 AM.png: Rule Test matched.
2021-08-27 16:45:25.374 hazelworker[27579] [File Event] File moved: Screen Shot 2021-08-27 at 11.58.31 AM.png moved from folder /Volumes/USB to folder /Users/martin.
2021-08-27 16:45:25.407 hazelworker[27579] [Error] Shell script failed: Error processing shell script on file /Users/martin/Screen Shot 2021-08-27 at 11.58.31 AM.png.
2021-08-27 16:45:25.407 hazelworker[27579] Shellscript exited with non-successful status code: 1
2021-08-27 16:45:27.430 hazelworker[27579] Done processing folder USB

error:
Code:
umount(/Volumes/USB): Resource busy -- try 'diskutil unmount'

Ich hab testweise einen "sleep 10" eingebaut um sicherzugehen, dass das OS im Hintergrund nichts mehr offen hält, aber das hat nichts gebracht. Auch ein Ändern des Befehls von "sudo umount" auf "diskutil unmount" bringt erstmal zwar ebenfalls keine Besserung, allerdings ist STDERR dann aussagekräftiger:

Code:
Volume USB on disk4s1 failed to unmount: dissented by PID 27672 (/Applications/Hazel.app/Contents/MacOS/hazelworker)
Dissenter parent PPID 27235 (/Applications/Hazel.app/Contents/Library/LoginItems/86Z3GCJ4MF.com.noodlesoft.HazelHelper.app/Contents/MacOS/86Z3GCJ4MF.com.noodlesoft.HazelHelper)
Der Prozess hazelworker hat das Volume /Volumes/USB noch geöffnet, weshalb es nicht ausgebunden werden kann.

Einzige Möglichkeit die ich gefunden habe: "diskutil umount force". Dann wird zwar mein Volume ausgebunden, der hazelworker stürzt allerdings ab:

Hazel.log:
Code:
2021-08-27 16:55:28.571 hazelworker[27703] Running worker (v5.0.7) for folder with identifier: 16777237-2.
2021-08-27 16:55:28.573 hazelworker[27703] ###main load address: 0x1045a8000
2021-08-27 16:55:28.573 hazelworker[27703] ###Hazel Core load address: 0x1045e0000
2021-08-27 16:55:28.573 hazelworker[27703] ###Noodle load address: 0x104888000
2021-08-27 16:55:28.573 hazelworker[27703] ###CK load address: 0x1046b0000
2021-08-27 16:55:28.595 hazelworker[27703] Processing folder USB
2021-08-27 16:55:30.644 hazelworker[27703] Screen Shot 2021-08-27 at 11.58.31 AM.png: Rule Test matched.
2021-08-27 16:55:30.739 hazelworker[27703] [File Event] File moved: Screen Shot 2021-08-27 at 11.58.31 AM.png moved from folder /Volumes/USB to folder /Users/martin.
2021-08-27 16:55:31.082 86Z3GCJ4MF.com.noodlesoft.HazelHelper[27235] Error retrieving volume mount point for /Volumes/USB: Error Domain=NSCocoaErrorDomain Code=260 "The file “USB” couldn’t be opened because there is no such file." UserInfo={NSURL=file:///Volumes/USB, NSFilePath=/Volumes/USB, NSUnderlyingError=0x125422120 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
2021-08-27 16:55:31.103 hazelworker[27703] Received exception while processing directory /Volumes/USB: File data is not a directory or smart folder.
2021-08-27 16:55:31.103 hazelworker[27703] ###main load address: 0x1045a8000
2021-08-27 16:55:31.103 hazelworker[27703] ###Hazel Core load address: 0x1045e0000
2021-08-27 16:55:31.103 hazelworker[27703] ###Noodle load address: 0x104888000
2021-08-27 16:55:31.103 hazelworker[27703] ###CK load address: 0x1046b0000
2021-08-27 16:55:31.105 hazelworker[27703] (
    0   CoreFoundation                      0x00000001912c4c28 __exceptionPreprocess + 240
    1   libobjc.A.dylib                     0x0000000190fed0a8 objc_exception_throw + 60
    2   CoreFoundation                      0x00000001912c4a74 +[NSException exceptionWithName:reason:userInfo:] + 0
    3   HazelCore                           0x00000001045efb00 hasNSRecords + 19140
    4   HazelCore                           0x00000001045ef82c hasNSRecords + 18416
    5   hazelworker                         0x00000001045b37dc hazelworker + 47068
    6   hazelworker                         0x00000001045b5060 hazelworker + 53344
    7   libdyld.dylib                       0x0000000191165430 start + 4
)

2021-08-27 16:55:33.120 hazelworker[27703] Could not switch to directory: </Volumes/USB>
2021-08-27 16:55:33.120 hazelworker[27703] Received exception while processing directory /Volumes/USB: *** -[__NSArrayM insertObject:atIndex:]: object cannot be nil
2021-08-27 16:55:33.121 hazelworker[27703] ###main load address: 0x1045a8000
2021-08-27 16:55:33.121 hazelworker[27703] ###Hazel Core load address: 0x1045e0000
2021-08-27 16:55:33.121 hazelworker[27703] ###Noodle load address: 0x104888000
2021-08-27 16:55:33.121 hazelworker[27703] ###CK load address: 0x1046b0000
2021-08-27 16:55:33.121 hazelworker[27703] (
    0   CoreFoundation                      0x00000001912c4c28 __exceptionPreprocess + 240
    1   libobjc.A.dylib                     0x0000000190fed0a8 objc_exception_throw + 60
    2   CoreFoundation                      0x000000019138fb18 -[__NSCFString characterAtIndex:].cold.1 + 0
    3   CoreFoundation                      0x000000019138d108 -[__NSArrayM insertObject:atIndex:].cold.2 + 0
    4   CoreFoundation                      0x00000001911e2e2c -[__NSArrayM insertObject:atIndex:] + 1020
    5   NoodleKit                           0x000000010491f448 main + 26484
    6   hazelworker                         0x00000001045b2558 hazelworker + 42328
    7   hazelworker                         0x00000001045b5060 hazelworker + 53344
    8   libdyld.dylib                       0x0000000191165430 start + 4
)
2021-08-27 16:55:33.122 hazelworker[27703] Done processing folder USB

error:
Code:
Volume USB on disk4s1 force-unmounted

Solange das der letzte Befehl in der Kette ist dürfte es also keine Problem geben, wenn der hazelworker-Prozess abstürzt. Er hat nach dem umount ja eh nichts mehr zu tun. diskutil läuft übrigens auch mit Userrechten, braucht also kein sudo. Es kann also als embedded script ausgeführt werden und benötigt keine Configdatei in /etc/sudoers.d
 
Vielen Dank für Deinen ausführlichen Test, habe ich doch nun die Bestätigung das der Fehler diesmal nicht 80cm vorm Bildschirm sitzt. Ich werde das "diskutil umount force“ einbauen und testen.

Danke.
 
Vielleicht in dem Script prüfen, ob Dateien auf der Volume noch offen sind.
Ein force unmount dürfte nicht der Integrität der Daten zugute kommen.
 
Wie prüfen? Mit lsof?
Code:
fred@FredsMini ~ % lsof /Volumes/K-1\ II  
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
86Z3GCJ4M 1243 fred   17r   DIR   1,34   131072    4 /Volumes/K-1 II
fred@FredsMini ~ %
Ist da was offen?
 
Zuletzt bearbeitet:
Du musst halt die Dateien bei lsof zählen.
Schließen geht an sich, wenn man den Prozess beendet, der die geöffnet hat.
 
So schaut es momentan aus:

Code:
fred@FredsMini ~ % lsof /Volumes/K-1\ II
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
Hazel      1241 fred  cwd    DIR   1,34   131072    5 /Volumes/K-1 II/DCIM
86Z3GCJ4M 12830 fred   12r   DIR   1,34   131072    4 /Volumes/K-1 II
fred@FredsMini ~ %

PID 12830 ist der neue Hazelhelper, nachdem ich den alten Hazelhelper PID 1243 beendet hatte.

Mittlerweile ist Hazel auch mit von der Partie. Ich vermute das hat damit zu tun weil ich die SD im Finder geöffnet habe. Jetzt kann ich die SD auch im Finder nicht mehr auswerfen, da kommt ein Requester der sagt dass Hazel den Vorgang blockiert und beendet werden muss. Bis dahin konnte ich die SD über den Finder auswerfen.

Da drängt sich mir die Frage auf: der Finder kann, obwohl ein Hazelhelper aktiv ist, die SD auswerfen, ein "diskutil eject /Volumes/K-1\ II" erzeugt aber im Terminal nur ein "Volume failed to eject"? Ich dachte immer das Terminal hätte gegenüber dem Finder mehr "Befehlsgewalt".

Wie dem auch sei, es funktioniert weiterhin bei mir nicht. Hazel reagiert auf den Trigger nicht. Egal welche Kriterien ich nehme, "Rule matches" ist grün aber "Rule Status" bleibt leer oder nimmt eine falsche Rule. Ich mach damit Schluss für heute, fast vier Stunden vom WE verbraten...

Ich denke ich werde auch in Zukunft die "manuelle" Methode anwenden.
Danke an alle Mitdenker.
 
Zurück
Oben Unten