명령 줄에서 직접 실행 가능한 실행 및 Linux의 Cron 작업에서 실행하는 것의 차이점은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1618238

  •  06-07-2019
  •  | 
  •  

문제

이 실행 가능은 명령을 위해 원격 서버를 쿼리하고 로컬 컴퓨터에서 실행하고 STDOUT (및 stderr)를 서버로 다시 반환합니다.

이 실행 파일은 명령 줄에서 호출되면 (루트로) 잘 실행되지만 CRON 작업에 의해 자동으로 실행될 때 일부 명령에 대해 실패한 것을 발견했습니다.

환경 (사용자, stdin, stdout 등)의 차이점은 무엇입니까? Crontab을 사용 하여이 실행 파일을 정기적으로 실행하도록 예상 할 때 기대해야합니까?

감사!

도움이 되었습니까?

해결책

가장 중요한 차이점은 .BASHRC 등과 같은 파일이 CRON 작업 전에 실행되지 않으므로 명령 줄에 정상적인 많은 환경 변수가 누락된다는 것입니다. 따라서 프로그램이 Cron 작업에서 작동하지 않으면 필요한 모든 환경 변수를 설정하는 스크립트에 포함시킵니다.

입력 및 출력과 관련하여 CRON 작업에 대한 사용자 상호 작용은 분명히 없으므로 프로그램은 입력을 기대하지 않아야합니다 (그렇다면 입력 파일이나 스크립트에서 직접 제공). 모든 출력을 로그 파일로 리디렉션해야합니다. .

다른 팁

이 실행 파일은 명령 줄에서 호출되면 (루트로) 잘 실행되지만 CRON 작업에 의해 자동으로 실행될 때 일부 명령에 대해 실패한 것을 발견했습니다.

CRON 작업에서는 스크립트를 실행할 사용자를 예를 들어 다음과 같이 지정할 수 있습니다.

0 0 * * * www-data /usr/bin/php /var/www/foo/do_work.php

나는 'do_work.php'를 매일 www-data로 실행하도록 지정하고 있습니다 ...이 파일은 /etc/cron.d/에 있습니다.

또한 CRON이 작업 실행에 사용하는 UID, 특히 사용자 수준이 아닌 '글로벌' /etc /crontab 작업 인 경우 UID를 확인해야 할 것입니다. 작업이 '아무도 없다'또는 '크론'에서 실행되는 경우 일부 권한이 부족할 수 있습니다.

주로

  • 현재 작업 디렉토리 - CRON에서 이것이 무엇인지 보장 할 수 없습니다. 집에 있을지 모르지만 그것에 의지하지 마십시오.
  • 환경 변수 - 일반 로그인을 위해 설정 한 대부분은 설정되지 않으므로 특정 값을 갖기 위해 환경 변수가 필요한 것은 실패 할 수 있습니다. 여기에는 특히 $ 경로가 포함됩니다.
  • stdin / stdout / stderr는 tty가되지 않으므로 일부 프로그램은 이것 때문에 다르게 행동합니다 (stdout과 err는 아마도 온도 파일 일 것입니다. stdin은 아마 null 일 것입니다).

그러나 본질적으로 당신은 많이 의존 할 수 없습니다

  • 사용자 ID, 그룹 ID 및 보충 그룹은 CRON 작업의 소유자에 대한 일반 로그인에 따라 설정해야합니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top