Convertendo o comando watch em um arquivo de unidade systemd

1

Eu tenho um script de shell como segue

ss.sh

#!/bin/bash
opFile="custom.data"
sourceFile="TestOutput"
./fc app test > $sourceFile
grep -oP '[0-9.]+(?=%)|[0-9.]+(?=[A-Z]+ of)' "$sourceFile" | tr '\n' ',' > $opFile
sed -i 's/,$//' $opFile

O requisito é que eu precise usar este script com o comando watch. E eu gostaria de fazer isso em um serviço systemctl. Eu fiz assim.

sc.sh

#!/bin/bash
watch -n 60 /root/ss.sh

E no meu / etc / systemd / system,

log_info.service

[Unit]

Description="Test Desc"
After=network.target

[Service]
ExecStart=/root/sc.sh
Type=simple

[Install]
WantedBy=default.target

Quando executo o systemctl start log_info.service, ele é executado, mas não continuamente da maneira que eu gostaria.

Ao executar o status do sytemctl, log_info.service,

info_log.service - "Test Desc"
   Loaded: loaded (/etc/systemd/system/info_log.service; disabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Mon 2016-09-12 08:17:02 UTC; 2min 18s ago
  Process: 35555 ExecStart=/root/sc.sh (code=exited, status=1/FAILURE)
 Main PID: 35555 (code=exited, status=1/FAILURE)

Sep 12 08:17:02 mo-b428aa6b4 systemd[1]: Started "Test Desc".
Sep 12 08:17:02 mo-b428aa6b4 sc.sh[35654]: Error opening terminal: unknown.
Sep 12 08:17:02 mo-b428aa6b4 systemd[1]: info_log.service: Main process exited, code=exited, status=1/FAILURE
Sep 12 08:17:02 mo-b428aa6b4 systemd[1]: info_log.service: Unit entered failed state.
Sep 12 08:17:02 mo-b428aa6b4 systemd[1]: info_log.service: Failed with result 'exit-code'.

Alguma idéia de por que não está funcionando certo? Qualquer ajuda seria apreciada!

    
por Izy- 12.09.2016 / 11:19

1 resposta

1

Como a mensagem de erro mostra, watch só pode ser usado em um terminal:

Error opening terminal: unknown

Mas sua exigência provavelmente não é para usar o script com watch . Sua exigência é executá-la a cada 60 segundos, e watch é a ferramenta que você acabou escolhendo.

O método mais comum para executar um script a cada 60 segundos seria cron - por exemplo, um * * * * * cronjob seria executado a cada minuto. Com systemd .services, você pode usar uma unidade .timer para o mesmo propósito:

# foo.timer
[Unit]
Description=Do whatever

[Timer]
OnActiveSec=60
OnUnitActiveSec=60

[Install]
WantedBy=timers.target

Então, em vez de iniciar o .service, você inicia o .timer em vez disso, e periodicamente tenta iniciar o .service por conta própria.

    
por 12.09.2016 / 14:41