Como iniciar um serviço systemd após o comando mount

5

Estou trabalhando em um laboratório para minha aula de Linux e o professor está nos ensinando sobre o Systemd.

Como faço para criar um serviço que inicie um script quando um dispositivo específico é montado usando este comando: mount /dev/xvdc1 /mnt/backup

O que eu tentei

  1. Usando um timer, verifiquei se /mnt/backup era um ponto de montagem. (professor não aceitaria. Deve ser estritamente por evento)
  2. Criando uma unidade .mount e fazendo com que a unidade .service exija a unidade .mount. Essa abordagem não iniciou o script ao executar o comando: mount /dev/xvdc1 /mnt/backup

Acho que posso estar abordando esse problema da maneira errada. Este é o problema do laboratório.

"Create a unit file that copies all the files from /mnt/backup using rsync as soon as /dev/xvdc1 is mounted."

O que eu sei:

  1. O dispositivo que será montado sempre será /dev/xvdc1
  2. O ponto de montagem do dispositivo será sempre /mnt/backup
  3. O serviço deve ser iniciado com base em /dev/xvdc1 sendo montado

Aqui está o meu arquivo de unidade .service

[Unit]
Description=Starts a backup for /dev/xvdc1 when mounted using the mount command.

[Service]
Type=simple
ExecStart=/root/backupscript.sh
ExecStop=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target
    
por Loligans 14.01.2017 / 06:12

1 resposta

1

Condições de início da unidade do sistema

With ConditionPathExists= a file existence condition is checked before a unit is started. If the specified absolute path name does not exist, the condition will fail. If the absolute path name passed to ConditionPathExists= is prefixed with an exclamation mark ("!"), the test is negated, and the unit is only started if the path does not exist.

ConditionPathIsMountPoint= is similar to ConditionPathExists= but verifies whether a certain path exists and is a mount point.

Parece que o método mais fácil é incluir

ConditionPathIsMountPoint=/mnt/backup

Na sua seção [Unit] . Embora isso não verifique qual dispositivo está montado lá, embora no caso de criar um backup, o usuário não pode ser exigente.

Você provavelmente também precisaria de Restart=on-failure para continuar tentando iniciar o serviço.

Um método mais preciso seria escrever uma regra de udev que inicia o serviço quando um determinado dispositivo é montado.

Como referência

Start by finding your device in lsusb. Note the ID (eg 0a81:0101)

Create a new udev rules file in /etc/udev/rules.d/ via sudoedit /etc/udev/rules.d/100-mount-videos.rulesand plonk a new rule in there like this:

ACTION=="add", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0101", RUN+="/home/your_username/bin/mount_videos.sh"

Você pode simplesmente substituir o RUN+= por RUN+=/usr/bin/systemctl start backup.service ou o nome que você chamou de seu serviço

    
por 27.04.2017 / 21:38