예약된 작업의 PHP 예

零下一度
풀어 주다: 2023-03-10 18:18:01
원래의
1793명이 탐색했습니다.

회사에서 사용하는 계획된 작업은 대략 다음과 같습니다.

*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testOne >/dev/null 2>&1*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testTwo >/dev/null 2>&1
로그인 후 복사

출력 및 표준 오류가 빈 장치로 리디렉션되는 것을 볼 수 있습니다. 몇 가지 정보를 확인하고 여기에 설명합니다.

1. SSH를 통해 서버에 로그인합니다.
2. 다음 코드를 사용하여 새 PHP 파일 test.php를 만듭니다.

<?php
sleep(50);
echo "aaa\n";
file_put_contents("/tmp/test.txt",time());?>
로그인 후 복사

3 다음 명령을 사용합니다. test.php 프로그램

$ php test.php &amp;
로그인 후 복사
로그인 후 복사

/tmp/test.txt 파일의 내용을 1497613738

4로 확인한 후 다음 명령을 다시 실행하세요. 명령이 실행된 후 즉시 종료 명령을 사용하여

$ php test.php &amp;
로그인 후 복사
로그인 후 복사

5 로그아웃합니다. 그런 다음 ssh를 통해 서버에 로그인하고 /tmp/test.txt 파일의 내용이 여전히 1497613738인지 확인합니다. 이는 test.php를 두 번째로 실행했을 때 file_put_contents 함수가 실행되지 않았거나 성공적으로 실행되지 않았음을 의미합니다.

6 file_put_contents 함수가 실행되지 않습니다.

7 이유:
로그아웃했다가 다시 로그인하면 왜 EIO 오류가 발생하나요? 이는 Linux 세션 처리와 관련이 있습니다.
사용자가 SSH를 통해 서버에 로그인하면 세션이 시작됩니다. 세션이 시작되면 표준 입력(stdin), 표준 출력(stdout), 표준 오류(stderr)가 해당 터미널(pty)에 연결됩니다.

사용자가 로그인하면 모든 표준 출력이 터미널에 반영됩니다. 표준 출력의 파일 핸들은 1입니다. 따라서 PHP에서 echo("aaan")

을 사용하면 시스템 호출 write(1, "aaan", 4)가 터미널에 기록됩니다.

사용자가 로그아웃하면 세션이 종료됩니다. 세션이 끝나면 터미널에 열려 있는 모든 파일 핸들을 읽거나 쓸 수 없도록 수정합니다.

사용자가 로그아웃한 후 write(1, "aaan", 4)를 실행하면 EIO 오류가 보고됩니다. 터미널 핸들은 더 이상 쓸 수 없기 때문입니다. EIO 오류가 발생한 후 프로세스가 종료됩니다.

해결책

방법 1:
재지정 기호 &를 사용하여 표준 출력을 구멍으로 재지정합니다.

正常情况下的追踪:
strace -p
로그인 후 복사


방법 2: nohup을 사용하세요.

Process 1475 attached
restart_syscall(<... resuming interrupted call ...>) = 0write(1, "aaa\n", 4aaa
)                    = 4lstat("/tmp/test.txt", 0x7ffe792ebe90)  = -1 ENOENT (No such file or directory)
lstat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=65536, ...}) = 0open("/tmp/test.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0lseek(3, 0, SEEK_CUR)                   = 0write(3, "1497614186", 10)              = 10close(3)                                = 0munmap(0x7f4840239000, 528384)          = 0close(2)                                = 0close(1)                                = 0munmap(0x7f4847510000, 4096)            = 0close(0)                                = 0munmap(0x7f4847511000, 4096)            = 0sched_getaffinity(1475, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 128sched_setaffinity(0, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 0munmap(0x7f48404c8000, 2119936)         = 0munmap(0x7f48406ce000, 2345056)         = 0munmap(0x7f4840b39000, 2162536)         = 0munmap(0x7f484090b000, 2282472)         = 0munmap(0x7f4840d49000, 323584)          = 0exit_group(0)                           = ?
+++ exited with 0 +++[1]+  Done                    php test.php
로그인 후 복사
지침:

프로세스를 실행 중이고 계정에서 로그아웃해도 프로세스가 끝나지 않을 것이라고 생각되면 nohup 명령을 사용할 수 있습니다.

이 명령은 계정에서 로그아웃하거나 터미널을 닫은 후에도 해당 프로세스를 계속 실행할 수 있습니다. nohup은 전화를 끊지 않는다는 뜻입니다.

저희 회사에서는 첫 번째 방법을 채택하고 있습니다. /dev/
null
2>&

1 &에 대한 설명은 다른 글을 참조하세요

위 내용은 예약된 작업의 PHP 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿