The scheduled tasks used by the company all look like this:
*/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
You can see that the output and standard error are redirected to an empty device. There is a certain reason for this. . I checked some information and describe it here:
1.Ssh login server<br>2. Create a new php file test.php, the code is as follows:
<?php sleep(50); echo "aaa\n"; file_put_contents("/tmp/test.txt",time());?>
3. Use the following command to execute the test.php program
$ php test.php &
to view the content of the /tmp/test.txt file as 1497613738
4. Then execute the following command again. After the command is executed, immediately use the exit command to log out
$ php test.php &
5 and then log in to the server via ssh and find that the content of the /tmp/test.txt file is still 1497613738. It means that when test.php was executed for the second time, the file_put_contents function was not executed or was not executed successfully.
6 Use strace to trace:
正常情况下的追踪: strace -p
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
<br>
Trace after exiting and logging in again:
strace -p 3881
restart_syscall(<... resuming interrupted call ...>) = 0write(1, "aaa\n", 4) = -1 EIO (Input/output error) munmap(0x7f6b7fc04000, 528384) = 0close(2) = 0close(1) = 0munmap(0x7f6b86edb000, 4096) = 0close(0) = 0munmap(0x7f6b86edc000, 4096) = 0sched_getaffinity(3881, 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(0x7f6b7fe93000, 2119936) = 0munmap(0x7f6b80099000, 2345056) = 0munmap(0x7f6b80504000, 2162536) = 0munmap(0x7f6b802d6000, 2282472) = 0munmap(0x7f6b80714000, 323584) = 0exit_group(0) = ? +++ exited with 0 +++
By comparison, you can see that there is an input/output error at the echo, and the file_put_contents function is not executed in the end.
7 Reason:
Why does an EIO error occur after logging out and then logging in again? This is related to Linux session processing. <br>When a user logs into a server via ssh, a session is started. After the session starts, standard input (stdin), standard output (stdout), and standard error (stderr) will be connected to a corresponding terminal (pty). <br>After the user logs in, any standard output will be reflected in the terminal. The file handle for standard output is 1. Therefore, echo("aaa\n") in php will cause the system call write(1, "aaa\n", 4) to be executed. aaa\n will be written in the terminal. <br>A session ends when the user logs out. At the end of the session, modify all file handles open to the terminal to be unreadable and unwritable; <br>If the user logs out and then executes write(1, "aaa\n", 4), an EIO error will be reported. Because the terminal handle is no longer writable. After an EIO error occurs, the process ends.
Solution<br>Method 1:<br>Use the redirection symbol & to redirect the standard output to the hole.
$ php test.php > /dev/null 2 >&1 & 这里的& 可以用也可以不用
Method 2: <br>Use nohup.
$ nohup php test.php &
Note:
If you are running a process and you feel that the process is still active when you log out of your account will not end, then you can use the nohup command.
This command can continue to run the corresponding process after you log out of your account/close the terminal. nohup means not to hang up (n ohang up).
Our company adopts the first method, regarding the description of /dev/null 2 >&1 &, See another article
The above is the detailed content of PHP examples of scheduled tasks. For more information, please follow other related articles on the PHP Chinese website!