Como ter uma variável de ambiente com aspas no crontab?

Como ter uma variável de ambiente com aspas no crontab?

Eu tenho um exemplo mínimo do meu problema, que é tentar instalar um crontab parecido com este:

FOO="foo\"bar\"bin"

0 0 1 * * ls

executando crontab crontab(eu tenho isso em um nome de arquivo crontab). Ele falha com este erro:

% crontab crontab
"crontab":0: bad minute
crontab: errors in crontab file, can't install

É a citação escapada, \", causando o problema.

Como faço para escapar das aspas nas variáveis ​​de ambiente do crontab.

Para adicionar um pouco mais de contexto, não estou apenas escrevendo variáveis ​​em um crontab escrito manualmente. Este crontab é gerado porem qualquer momento(uma gem Ruby), possui cerca de 70 entradas e pega todas as variáveis ​​de ambiente e as coloca como variáveis ​​no crontab para que todas as credenciais estejam disponíveis para os scripts. O problema é que recentemente adicionei um complexo que contém aspas e que quebrou esse sistema.

Caso você esteja curioso, o código Ruby que gera as variáveis ​​é:

ENV.each do |key, value|
  env key.to_sym, value.inspect
end

Responder1

A boa prática para croné:

  1. Crie um script para executar os comandos
  2. Defina variáveis ​​no script. Também é possível usar arquivo externo com variáveis:source /path/to/file/with/variables
  3. Use o caminho completo para comandos/usr/bin/ls
  4. Não confie na casa do usuário, caminho, etc.

E aqui está um exemplo de como você pode criar um script de shell que executa rubyprogramas em diferentes ambientes.

Em cronvocê tem registros como (exemplo):

0 1 * * * /path/script 1
0 2 * * * /path/script 2

O script em si é algo como:

#!/bin/bash
a=$1
case "$a" in

1)  source /path/file1
    /path/to/ruby <parameters>
    ;;
2)  source /path/file2
    /path/to/ruby <parameters>
    ;;
<snip>

*) # do something if parameter is not enumerated
   ;;
esac

e file1contém algo como (exemplo)

RUBYVAR1_1=1
RUBYVAR1_2=2

efile2

RUBYVAR2_1=12
RUBYVAR2_2=22

Responder2

man 5 crontab

Uma linha ativa em um crontab será uma configuração de ambiente ou um comando cron. Uma configuração de ambiente tem a forma,

 name = value

onde os espaços ao redor do sinal de igual (=) são opcionais e quaisquer espaços não iniciais subsequentes em valor farão parte do valor atribuído ao nome. A string de valor pode ser colocada entre aspas (simples ou duplas, mas correspondentes) para preservar os espaços em branco à esquerda ou à direita.

Portanto, colocar sua string contendo aspas duplas com aspas simples deve funcionar

Testado com um crontab:

var = 'this"contains"quotes'

* * * * * /usr/bin/env  >> /tmp/env

Parece que armazenará corretamente suas aspas duplas na var.

cat /tmp/env

HOME=/home/HBruijn
LANG=C.UTF-8
SHELL=/bin/sh
var=this"contains"quotes

Mas também concordo com a resposta e o sentimento anteriores; cron não é um ambiente de script adequado, é apenas um agendador de tarefas antigo com muitas limitações e você deve descarregar qualquer coisa que se assemelhe à complexidade e incluí-la no próprio trabalho.

Responder3

Pelo que pude descobrir, as variáveis ​​crontab simplesmente não podem ter aspas e também não podem ter mais de 999 caracteres. A resposta a esta pergunta é que simplesmente não é possível.

informação relacionada