crontab에서 따옴표가 있는 환경 변수를 갖는 방법은 무엇입니까?

crontab에서 따옴표가 있는 환경 변수를 갖는 방법은 무엇입니까?

내 문제의 최소한의 예는 다음과 같은 crontab을 설치하려고 하는 것입니다.

FOO="foo\"bar\"bin"

0 0 1 * * ls

실행하여 crontab crontab(파일 이름에 있습니다 crontab). 다음 오류로 인해 실패합니다.

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

이스케이프된 따옴표로 인해 \"문제가 발생합니다.

crontab의 환경 변수에서 따옴표를 어떻게 이스케이프합니까?

좀 더 자세한 내용을 추가하기 위해 수동으로 작성된 crontab에 변수를 작성하는 것이 아닙니다. 이 crontab은 다음에 의해 생성됩니다.언제든지(Ruby gem)에는 약 70개의 항목이 있으며 모든 환경 변수를 선택하여 crontab에 변수로 저장하므로 모든 자격 증명을 스크립트에서 사용할 수 있습니다. 문제는 최근에 따옴표가 포함된 복잡한 항목을 추가했는데 이로 인해 이 시스템이 중단되었다는 것입니다.

궁금하신 경우 변수를 생성하는 Ruby 코드는 다음과 같습니다.

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

답변1

모범 사례는 다음과 cron같습니다.

  1. 명령을 실행하는 스크립트 만들기
  2. 스크립트에서 변수를 설정합니다. 변수가 있는 외부 파일을 사용할 수도 있습니다.source /path/to/file/with/variables
  3. 명령에 전체 경로 사용/usr/bin/ls
  4. 사용자 홈, 경로 등에 의존하지 마십시오.

ruby다음은 다양한 환경에서 프로그램을 실행하는 하나의 셸 스크립트를 만드는 방법의 예입니다 .

cron(예)와 같은 기록이 있습니다 .

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

스크립트 자체는 다음과 같습니다.

#!/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

file1(예)와 같은 내용을 포함합니다 .

RUBYVAR1_1=1
RUBYVAR1_2=2

그리고file2

RUBYVAR2_1=12
RUBYVAR2_2=22

답변2

man 5 crontab

crontab의 활성 행은 환경 설정 또는 cron 명령입니다. 환경 설정은 다음과 같은 형식입니다.

 name = value

여기서 등호(=) 주위의 공백은 선택 사항이며 value에서 선행하지 않는 공백은 name에 할당된 값의 일부가 됩니다. 값 문자열은 선행 또는 후행 공백을 유지하기 위해 따옴표(단일 또는 이중, 일치) 안에 배치될 수 있습니다.

따라서 큰따옴표가 포함된 문자열을 작은따옴표로 묶으면 작동합니다.

crontab으로 테스트했습니다.

var = 'this"contains"quotes'

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

var에 큰따옴표를 올바르게 저장하는 것 같습니다.

cat /tmp/env

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

그러나 나는 이전 답변과 감정에도 동의합니다. cron은 적절한 스크립팅 환경이 아니며 많은 제한이 있는 고대 작업 스케줄러일 뿐이므로 복잡성과 유사한 모든 것을 오프로드하여 작업 자체에 포함해야 합니다.

답변3

내가 찾은 한, crontab 변수는 따옴표를 가질 수 없으며 길이도 999자를 초과할 수 없습니다. 이 질문에 대한 대답은 단순히 불가능하다는 것입니다.

관련 정보