Eu tenho um drive USB que é automaticamente descriptografado e montado quando eu o conecto. Então, uma vez montado, executo um script de backup para rsync o FS local para aquele disco. E então eu ejete a unidade.
Eu gostaria de automatizar isso para que, quando eu conectar a unidade, ela seja descriptografada e montada, o script seja executado e a unidade seja desmontada / ejetada. (Se eu conseguir receber uma notificação quando terminar, é ainda melhor, mas opcional.)
Então eu tentei com o systemd, mas estou aberto a outras soluções (embora agora que passei tempo lutando com o systemd, eu realmente gostaria de entender como isso funciona).
Por enquanto eu tentei criar um serviço que depende da montagem da unidade USB. Mas o serviço falha ao ativar a reclamação de que a montagem não existe quando a unidade não está conectada.
Então, tentei criar uma unidade de caminho:
[Unit]
Description=Monitors the backup path availability
[Path]
PathExists=/run/media/user/backup
[Install]
WantedBy=multi-user.target
Quando o caminho se torna disponível, ele inicia o serviço correspondente:
[Unit]
Description=Rsync System Backup
Requires=usb-hd-backup.path
[Service]
ExecStart=/usr/bin/rsync -aAXS --info=progress2 --delete --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /run/media/user/backup
[Install]
WantedBy=graphical.target
Isso funciona pela primeira vez. Mas quando desmonto a unidade, o caminho permanece (isso não acontece quando eu inicio o script manualmente). Então, da próxima vez que eu conectar o drive, ele será descriptografado e, como o caminho original já existe, ele será montado em um caminho diferente (o mesmo que o original com um '1' anexado no final). Portanto, os scripts são executados em um caminho que não leva à unidade (e falha, pois a montagem / run é muito pequena).
Eu acho que há algumas idéias de systemd que eu realmente não entendo aqui.
Tags systemd