[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.
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