Starten Sie den Agenten, auf dem Bash File nicht ausgeführt wird

0

Ich habe ein Bash-Skript imagecopy.sh, das Images, die sich in einem Unterverzeichnis befinden, mit einer vorangestellten Datumszeichenfolge sichert. Dies funktioniert einwandfrei, wenn ich es aus dem Verzeichnis ausführe, in dem es sich befindet /Users/danny/Library/Caches/.

Das Drehbuch ist

#!/usr/bin/env bash
cat himawaripy/latest.png > himawaripy/output/$(date "+%Y.%m.%d-%H.%M.%S").png

Ich habe auch das Verzeichnis, in dem sich das Skript befindet, zu meiner $PATHVerwendung hinzugefügt nano .profileund diese Verwendung bestätigt echo $PATH.

/Users/danny/Library/Caches:/Users/danny/anaconda/bin:/Library/Frameworks/Python.framework/Versions/3.4/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/TeX/texbin

Ich möchte das Bash-Skript regelmäßig mit einem LaunchAgent ausführen, der sich in befindet /Users/danny/Library/LaunchAgents.

Die LaunchAgent-Datei com.user.imagecopier.plistverweist durch die Zeilen auf den Skriptspeicherort.

..other code

<key>Program</key>
<string>imagecopy.sh</string>

...etc

Ich gehe davon aus, dass ein Fehler beim Verknüpfen der LaunchAgent-Datei mit dem Skript vorliegt. Vorschläge sind sehr willkommen.

Bearbeiten: LaunchAgent-Datei wie vorgeschlagen aktualisiert

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.user.imagecopier</string>

  <key>ProgramArguments</key>
  <array>
    <string>/Users/danny/Library/Caches/imagecopy.sh</string>
  </array>

  <key>Nicer</key>
  <integer>1</integer>

  <key>StartInterval</key>
  <integer>60</integer>

  <key>RunAtLoad</key>
  <true/>

</dict>
</plist>
danny_C_O_T_W
quelle
2
Warum kopierst du catDateien? Verwenden Sie den Schlüssel ProgramArgumentsmit dem absoluten Pfad zum Skript. Und die absoluten Pfade zur Quell- und Zieldatei in Ihrem Skript.
fd0
Danke @ fd0! Mit den von Ihnen vorgeschlagenen Änderungen (absolute Pfade) wird das Skript nun von jedem Verzeichnis aus erfolgreich ausgeführt. Leider funktioniert LaunchAgent immer noch nicht ... Ich habe die aktualisierte Datei als Referenz hinzugefügt.
danny_C_O_T_W
Das Skript sollte auch absolute Pfade enthalten (oder PATH selbst am Anfang festlegen), nicht nur die LaunchAgent-Plist. Auch cating eine Datei auf ein anderes Aussehen irgendwie seltsam, nur verwenden cp(wenn Sie die Quelldatei behalten möchten) oder mv(wenn Sie es umbenennen möchten).
Nohillside
1
Ah, und warum benutzt du <key>ProgramArguments</key>hier?
Nohillside

Antworten:

1
  1. Das Speichern eines Shell-Skripts in einem Caches-Ordner ist sehr ungewöhnlich !
  2. Wenn Sie in Ihrem Skript und in der Plist absolute Pfade verwenden, müssen Sie Ihrer PATH-Variablen keine undurchsichtigen Pfade hinzufügen.

Bereinigen Sie die Datei .profile / .bash_profile und entfernen Sie den Teil / Users / danny / Library / Caches:!

Erstellen Sie einen bin-Ordner in Ihrem Benutzerordner und fügen Sie ein Skript mit dem Namen imagecopy.sh ein . Der Inhalt des Skripts ist:

#!/bin/sh
cp /Users/danny/Library/Caches/latest.png /Users/danny/Documents/output/$(date "+%Y.%m.%d-%H.%M.%S").png

Erstellen Sie einen geeigneten Ausgabeordner. Im obigen Beispiel verwende ich ~ / Documents / output.

Erstellen Sie die Datei /Users/danny/Library/LaunchAgents/com.user.imagecopier.plist mit dem Inhalt:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.user.imagecopier</string>
    <key>Nicer</key>
    <integer>1</integer>
    <key>Program</key>
    <string>/Users/danny/bin/imagecopy.sh</string>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/tmp/com.user.imagecopier.stderr</string>
    <key>StandardOutPath</key>
    <string>/tmp/com.user.imagecopier.stdout</string>
    <key>StartInterval</key>
    <integer>60</integer>
</dict>
</plist>

In der Datei /tmp/com.user.imagecopier.stderr wird ein Fehler angezeigt (z. B. wenn der Ausgabeordner fehlt oder keine Datei latest.png verfügbar ist).

Laden Sie die Datei mit:

launchctl load -w /Users/danny/Library/LaunchAgents/com.user.imagecopier.plist

Wenn der Startagent ordnungsgemäß funktioniert, können Sie das Teil entfernen

    <key>StandardErrorPath</key>
    <string>/tmp/com.user.imagecopier.stderr</string>
    <key>StandardOutPath</key>
    <string>/tmp/com.user.imagecopier.stdout</string>

von der plist.

klanomath
quelle
Vielen Dank! Dies sieht nach einer nachhaltigeren und saubereren Lösung aus. Nach einem Neustart des Systems haben meine ersten Versuche funktioniert, aber ich denke, ich werde mich an dieses Protokoll anpassen.
Danny_C_O_T_W