0 votos

El agente de lanzamiento no se ejecuta Archivo Bash

Tengo un bash script imagecopy.sh que hace una copia de seguridad de las imágenes que se encuentran en un subdirectorio con una cadena de fecha añadida: esto funciona perfectamente cuando lo ejecuto desde el directorio en el que reside - /Users/danny/Library/Caches/ .

El script es

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

También he añadido el directorio donde se encuentra el script a mi $PATH utilizando nano .profile y lo confirmó utilizando 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

Me gustaría ejecutar el bash script periódicamente utilizando un LaunchAgent, ubicado en /Users/danny/Library/LaunchAgents .

El archivo LaunchAgent com.user.imagecopier.plist hace referencia a la ubicación de script por las líneas..

..other code

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

...etc

Supongo que hay un error al enlazar el archivo LaunchAgent con el script, cualquier sugerencia sería muy apreciada.

Editar: Actualización del archivo LaunchAgent según lo sugerido

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

0 votos

¡Gracias @fd0 ! Con los cambios que sugeriste (rutas absolutas) el script ahora se ejecuta correctamente desde cualquier directorio. lamentablemente LaunchAgent sigue sin funcionar... He añadido el archivo actualizado como referencia.

0 votos

El script debe contener rutas absolutas también (o establecer el propio PATH al principio), no sólo el plist de LaunchAgent. También cat un archivo a otro parece un poco extraño, sólo tiene que utilizar cp (si desea conservar el archivo fuente) o mv (si sólo quieres cambiarle el nombre).

1 votos

Ah, ¿y por qué usas <key>ProgramArguments</key> ¿Aquí?

1voto

klanomath Puntos 19587
  1. Para almacenar un shell script en una carpeta Caches es muy poco común ¡!
  2. Si usas rutas absolutas en tu script y el plist no tienes que añadir rutas oscuras a tu variable PATH.

Limpia tu archivo .profile/.bash_profile y elimina la parte /Users/danny/Library/Caches:.

Crea una carpeta bin en tu carpeta de usuario y pon un script con el nombre imagecopy.sh . El contenido del script es:

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

Cree una carpeta de salida adecuada. En el ejemplo anterior utilizo ~/Documents/output.

Cree el archivo /Users/danny/Library/LaunchAgents/com.user.imagecopier.plist con el contenido:

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

El archivo /tmp/com.user.imagecopier.stderr mostrará cualquier error (por ejemplo, si falta la carpeta de salida o no está disponible latest.png)

Carga el archivo con:

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

Si el agente de lanzamiento funciona correctamente, puedes retirar la pieza

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

del plist.

0 votos

Gracias! esta parece una solución más sostenible/neutral. tras un reinicio del sistema mis intentos iniciales funcionaron, pero creo que me adaptaré a este protocolo.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X