Launch Agent non esegue il file Bash

0

Ho uno script di bash imagecopy.sh che esegue il backup di immagini che si trovano in una sottodirectory con una stringa di date anteposta: funziona perfettamente quando eseguo dalla directory in cui si trova - /Users/danny/Library/Caches/ .

Lo script è

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

Ho anche aggiunto la directory in cui si trova lo script al mio $PATH usando nano .profile e ho confermato questo utilizzando 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

Vorrei eseguire periodicamente lo script bash utilizzando un LaunchAgent, situato in /Users/danny/Library/LaunchAgents .

Il file LaunchAgent com.user.imagecopier.plist fa riferimento alla posizione dello script in base alle linee ..

..other code

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

...etc

Presumo che ci sia un errore nel collegamento del file LaunchAgent allo script, qualsiasi suggerimento sarebbe molto apprezzato.

Modifica: file LaunchAgent aggiornato come suggerito

<?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>
    
posta danny_C_O_T_W 04.08.2016 - 11:37
fonte

1 risposta

1
  1. Per memorizzare uno script di shell in una cartella Caches è molto raro !
  2. Se utilizzi percorsi assoluti nello script e il plist non devi aggiungere percorsi oscuri alla variabile PATH.

Pulisci il tuo file .profile / .bash_profile e rimuovi / Users / danny / Library / Caches: part!

Crea una cartella bin nella tua cartella utente e inserisci uno script con il nome imagecopy.sh . Il contenuto dello script è:

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

Crea una cartella di output appropriata. Nell'esempio sopra uso ~ / Documents / output.

Crea il file /Users/danny/Library/LaunchAgents/com.user.imagecopier.plist con il contenuto:

<?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>

Il file /tmp/com.user.imagecopier.stderr mostrerà qualsiasi errore (ad es. se la cartella di output manca o non è disponibile latest.png)

Carica il file con:

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

Se l'agente di lancio funziona correttamente, puoi rimuovere la parte

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

del plist.

    
risposta data 04.08.2016 - 19:08
fonte

Leggi altre domande sui tag