본문 바로가기

Programing/Framework

[Laravel] Scheduled Jobs 에러 수행 결과 받기

얼마전에 .env 파일 설정이 공백이 들어가 있어서 스케줄된 작업이 돌지 않았던 일이 있었다.

 

당시 환경 변수들을 .env 에서 getenv(), $_ENV, $_SERVER 등으로 자동적으로 가져올 수 있게 하는 의존성 패키지인 vlucas/phpdotenv 2.6.9 버전을 쓰고 있었다.

 

.env 설정 정보에 공백이 들어가 있을 때 아래와 같은 메시지가 나오면서 작업은 수행되지 않는다.

The environment file is invalid: Dotenv values containing spaces must be surrounded by quotes.

https://github.com/vlucas/phpdotenv/blob/2e93cc98e2e8e869f8d9cfa61bb3a99ba4fc4141/src/Parser.php#L126

 

InvalidFileException 라는 예외를 발생시키는데 계층은 SPL 예외 중 하나인 InvalidArgumentException를 상속하고 있다.

throw new InvalidFileException('Dotenv values containing spaces must be surrounded by quotes.');

정말?

vendor 디렉터리 하위에 vlucas/phpdotenv가 있다.

"Dotenv values containing spaces must be surrounded by quotes." 부분이 두 군데가 있는데 어떤 부분에서 발생하나 확인을 해보았다. 그랬더니 126 라인에 문제가 있음을 확인했다.

 

parseUnquotedValue 함수에 printf를 넣어서 어떤 값이 문제가 되었는지도 확인이 가능하다.

public static function parseUnquotedValue($value)
{
    $parts = explode(' #', $value, 2);
    $value = trim($parts[0]);
    printf("value: %s\n", $value); # 값 확인을 위해 추가한 부분

 

Task Scheduling 수행시 리다이렉트

아래와 같은 유형의 crontab 명령어를 사용하고 있었다.

php artisan schedule:run > /home/forge/.forge/scheduled-81647.log 2>&1

laravel의 scheduling 문서에 보면 >가 아닌 >>로 replace가 아닌 append를 하고 있는 것을 예시로 보여준다.

  • ">": truncate and write
  • ">>": append
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

 

>> /dev/null는 표준출력(stdout)를 /dev/null 즉 폐기(discard)하겠다는 의미이다. 폐기시에는 사실 필요가 없는 것이다.

2>&1은 표준에러(2: stderr)를 표준출력(1: stdout)로 리디렉션을 하는 것이다.

$ ls -l file_doesnot_exists > /dev/null
$ ls -l file_doesnot_exists > /dev/null 2>&1

 

  • 0 is stdin
  • 1 is stdout
  • 2 is stderr