J'écris un script bash qui s'exécute lorsque je branche mon téléphone Android 6.0.1 sur mon ordinateur portable Ubuntu 16.04. Je suis bloqué au point où le script s'exécute correctement lorsque je l'exécute manuellement à partir d'une session de terminal, mais il échoue lorsque j'essaie de l'exécuter automatiquement via une règle udev.
Le contenu de /etc/udev/rules.d/99-Android.rules est :
ACTION=="add", ATTRS{idVendor}=="04e8", ATTRS{idProduct}=="6860",MODE="0666", RUN+="/data/personal/backup/backup_galaxya5_start"
Le contenu de /data/personal/backup/backup_galaxya5_start est :
#!/bin/bash
sudo -u marc echo /data/personal/backup/backup_galaxya5 | at now
Le contenu de /data/personal/backup/backup_galaxya5 est un tas de choses, mais il se résume essentiellement à :
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"
Comme je l'ai dit, l'exécuter lorsque le téléphone est branché à partir d'un terminal fonctionne sans aucun problème. Cependant, lorsque je branche le téléphone pour que le script s'exécute automatiquement, il se produit ce qui suit :
- La règle udev détecte le fait que le téléphone a été branché et exécute /data/personal/backup/backup_galaxya5_start.
- Ce fichier utilise la commande at pour programmer l'exécution du script de sauvegarde.
- Le script de sauvegarde proprement dit s'exécute et démarre le serveur adb.
- Le script de sauvegarde est alors incapable de copier le fichier rsync.bin sur le téléphone.
- Les commandes adb suivantes échouent également.
A un moment donné, j'ai même modifié le script pour récupérer la commande "adb push" qui a échoué et ensuite faire un "adb kill-server", mais cela n'a pas aidé non plus.
J'aimerais savoir ce qu'il me manque pour que ce script fonctionne lorsqu'il est appelé à partir de la règle udev.