CRON 작업에서 PHP 스크립트가 실행되지 않는 문제는 경로, 권한, 환경변수 등 다양한 원인이 있습니다. 주요 해결책을 알아보겠습니다.
문제: CRON에서 PHP 실행 파일을 찾지 못함
which php
# crontab -e
# 잘못된 방법
0 */6 * * * php /var/www/html/cron/backup.php
# 올바른 방법 - 절대 경로 사용
0 */6 * * * /usr/bin/php /var/www/html/cron/backup.php
#!/usr/bin/php
<?php
// 스크립트 시작 로그
error_log("CRON 백업 스크립트 시작: " . date('Y-m-d H:i:s'));
// 백업 로직
$backup_file = '/backup/db_' . date('Y-m-d_H-i-s') . '.sql';
$command = "mysqldump -u username -p'password' database_name > $backup_file";
exec($command, $output, $return_code);
if ($return_code === 0) {
error_log("백업 완료: $backup_file");
} else {
error_log("백업 실패: " . implode("\n", $output));
}
?>
문제: 상대 경로나 환경변수 문제로 스크립트 실행 실패
# crontab -e
# 환경변수와 작업 디렉토리 설정
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
SHELL=/bin/bash
# 작업 디렉토리 변경 후 실행
0 2 * * * cd /var/www/html && /usr/bin/php cron/daily_report.php
<?php
// 작업 디렉토리 확인 및 설정
$script_dir = dirname(__FILE__);
$project_root = dirname($script_dir);
chdir($project_root);
// 설정 파일 로드
require_once 'config/database.php';
require_once 'includes/functions.php';
// 로그 파일 경로 설정
$log_file = $project_root . '/logs/cron.log';
file_put_contents($log_file, date('Y-m-d H:i:s') . " - 일일 리포트 시작\n", FILE_APPEND);
// 리포트 생성 로직
generateDailyReport();
file_put_contents($log_file, date('Y-m-d H:i:s') . " - 일일 리포트 완료\n", FILE_APPEND);
?>
문제: 스크립트 파일에 실행 권한이 없음
chmod +x /var/www/html/cron/cleanup.php
chown www-data:www-data /var/www/html/cron/cleanup.php
#!/usr/bin/php
<?php
// 임시 파일 정리 스크립트
$temp_dir = '/tmp/app_temp';
$log_dir = '/var/www/html/logs';
// 7일 이상 된 임시 파일 삭제
$files = glob($temp_dir . '/*');
foreach ($files as $file) {
if (is_file($file) && time() - filemtime($file) > 7 * 24 * 3600) {
unlink($file);
error_log("삭제된 파일: $file");
}
}
// 30일 이상 된 로그 파일 압축
$log_files = glob($log_dir . '/*.log');
foreach ($log_files as $log_file) {
if (time() - filemtime($log_file) > 30 * 24 * 3600) {
$gz_file = $log_file . '.gz';
$command = "gzip -c $log_file > $gz_file && rm $log_file";
exec($command);
}
}
?>
문제: CRON 실행 결과나 오류를 확인할 수 없음
# crontab -e
# 출력과 오류를 모두 로그 파일로 저장
0 1 * * * /usr/bin/php /var/www/html/cron/email_sender.php >> /var/log/cron_email.log 2>&1
# 오류만 별도 로그로 저장
30 3 * * * /usr/bin/php /var/www/html/cron/data_sync.php > /dev/null 2>> /var/log/cron_error.log
<?php
// 오류 보고 설정
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', '/var/log/php_cron_errors.log');
try {
echo date('Y-m-d H:i:s') . " - 이메일 발송 시작\n";
// 이메일 발송 로직
$pending_emails = getPendingEmails();
foreach ($pending_emails as $email) {
if (sendEmail($email)) {
echo "이메일 발송 성공: {$email['to']}\n";
markEmailAsSent($email['id']);
} else {
echo "이메일 발송 실패: {$email['to']}\n";
}
}
echo date('Y-m-d H:i:s') . " - 이메일 발송 완료\n";
} catch (Exception $e) {
echo "오류 발생: " . $e->getMessage() . "\n";
error_log("CRON 이메일 발송 오류: " . $e->getMessage());
}
?>
문제: CRON 작업이 제대로 동작하는지 확인하기 어려움
#!/usr/bin/php
<?php
// CRON 테스트 스크립트
$test_file = '/tmp/cron_test_' . date('Y-m-d_H-i-s') . '.txt';
$info = [
'timestamp' => date('Y-m-d H:i:s'),
'user' => get_current_user(),
'working_directory' => getcwd(),
'php_version' => PHP_VERSION,
'memory_limit' => ini_get('memory_limit'),
'include_path' => get_include_path(),
'environment' => $_ENV
];
file_put_contents($test_file, print_r($info, true));
// 이메일로 결과 전송 (선택사항)
if (function_exists('mail')) {
mail('admin@example.com', 'CRON 테스트 결과', "테스트 파일: $test_file");
}
echo "테스트 완료: $test_file\n";
?>
# 수동으로 CRON 스크립트 테스트
/usr/bin/php /var/www/html/cron/test_cron.php
# CRON 로그 확인
tail -f /var/log/cron.log