Internet, Informática e Tecnologia

Solução: systemd-run não é executado corretamente no Cron

systemd-run help

Em sistemas como o Debian e o Ubuntu, temos a ferramenta systemd-run, que faz parte do sistema systemd. Um dos recursos dessa ferramenta é a capacidade de controlar e limitar os recursos do sistema com cotas e limites para cada serviço em execução. Há várias maneiras de executar o systemd-run, mas o principal motivo desta entrada é para aquelas ocasiões em que ele não é executado ao usar o cron, pois, como muitos sabem, a depuração de tarefas no cron é uma tarefa tediosa e um tanto complicada.

Problema

Eu estava usando o systemd-run para executar tarefas como backups e serviços cron para aplicativos da Web que estavam funcionando corretamente no terminal, mas quando verifiquei os registros, eles não estavam sendo executados a partir do cron do sistema. 
Usei o systemd-run em vários modos de execução com uma variação de parâmetros e não funcionou. Eu estava tentando executar as tarefas com limite de CPU por porcentagem e limite de IO. Até agora, tudo parecia normal. O problema é: como é possível que uma tarefa seja executada corretamente no terminal e, no cron, falhe silenciosamente?

Solução

Com um pouco de depuração adicional, ao verificar o syslog, notei que o registro de comandos estava incompleto, praticamente pela metade, e foi isso que me ajudou a encontrar o problema. Por si só, não havia descrição real de um problema, era como se estivesse executando metade de um comando no cron.

Então percebi que, quando usamos símbolos de porcentagem em tarefas que estão no cron, eles devem ser escapados e, nesse caso, eu estava usando o símbolo de porcentagem para o limite de CPU na execução do sistema.

Este é um exemplo de minha tarefa agendada quando ela falhou silenciosamente.

30 */2 * * * /usr/bin/systemd-run --setenv=HOME=/root --nice 19 --pipe -p CPUQuota=70% …

Para escapar do símbolo de porcentagem, basta adicionar uma barra invertida antes do símbolo.

30 */2 * * * /usr/bin/systemd-run --setenv=HOME=/root --nice 19 --pipe -p CPUQuota=70\% …

Dessa forma, tudo começou a funcionar normalmente. O problema aqui era que eu não sabia que era necessário escapar de determinados caracteres nas listas de tarefas agendadas do cron.

Conclusão

Parece uma coisa simples, mas um pequeno erro como esse pode acabar com dias produtivos e transformá-los em dores de cabeça. Talvez isso tenha acontecido porque eu nunca precisei usar caracteres especiais em um cron antes, ou talvez eu não tenha lido a documentação do cron, além da documentação do systemd-run, que, é claro, eu examinei várias vezes ao tentar encontrar o erro.

Categorías

Conteúdo semelhante