Estoy escribiendo un bash script que se ejecutará al conectar mi teléfono Android 6.0.1 en mi portátil Ubuntu 16.04. Estoy atascado en el punto en el que el script se ejecuta bien cuando lo hago manualmente desde una sesión de terminal, pero falla cuando intento que se ejecute automáticamente a través de una regla udev.
El contenido de /etc/udev/rules.d/99-Android.rules es:
ACTION=="add", ATTRS{idVendor}=="04e8", ATTRS{idProduct}=="6860",MODE="0666", RUN+="/data/personal/backup/backup_galaxya5_start"
El contenido de /data/personal/backup/backup_galaxya5_start es:
#!/bin/bash
sudo -u marc echo /data/personal/backup/backup_galaxya5 | at now
El contenido de /data/personal/backup/backup_galaxya5 es un montón de cosas, pero esencialmente se reduce a:
adb start-server
adb push /data/download/rsync4android/rsync.bin /data/local/tmp/rsync >> "$LOGFILE"
adb shell chmod 755 /data/local/tmp/rsync >> "$LOGFILE"
adb shell 'exec >/data/local/tmp/rsyncd.conf && echo address = 127.0.0.1 && echo port = 1873 && echo "[root]" && echo path = / && echo use chroot = false && echo read only = false' >> "$LOGFILE"
adb shell /data/local/tmp/rsync --daemon --no-detach --config=/data/local/tmp/rsyncd.conf --log-file=/proc/self/fd/2 & >> "$LOGFILE"
adb forward tcp:6010 tcp:1873
rsync -av --exclude .thumbnails/ "rsync://localhost:6010/root/sdcard/DCIM/" "$TARGETDIR" > "$RSYNCLOGFILE"
Como he dicho, ejecutar esto cuando el teléfono está conectado desde un terminal funciona sin problemas. Sin embargo, cuando conecto el teléfono para que el script se ejecute automáticamente, ocurre lo siguiente:
- La regla udev recoge el hecho de que el teléfono estaba enchufado y ejecuta /data/personal/backup/backup_galaxya5_start.
- Ese archivo utiliza el comando at para programar la ejecución de la copia de seguridad real script.
- La copia de seguridad real script se ejecuta e inicia el servidor adb.
- La copia de seguridad script es entonces incapaz de copiar el archivo rsync.bin al teléfono.
- Los comandos adb posteriores también fallan.
En algún momento incluso cambié el script para recoger el comando "adb push" fallido y luego hacer un "adb kill-server", sin embargo esto tampoco ayudó.
Me gustaría saber qué me falta para que este script funcione al ser llamado desde la regla udev.