您可以通过将命令包装在shell命令中来解决这个问题:
xterm -e sh -c "php 1.php"
你可以看到使用strace的行为(例如,"strace—fo trace.log—s 1024 xterm"等):
- 在非工作的情况下,初始xterm进程忽略
SIGHUP
(xterm创建两个进程,第一个进程管理伪终端,第二个进程管理X窗口). 这个信号被传递给php进程(在脚本中捕获).
- 在工作情况下,即使初始的xterm进程忽略了
SIGHUP
,信号也会传递给shell进程,shell进程不会忽略它.
整个日志(log)很长,但只有SIGHUP
行(并参考整个日志(log)来确定哪个process—id是哪个)就能说明问题. 以下是非工作 case 的摘录(2209为初始):
2212 rt_sigaction(SIGHUP, {sa_handler=SIG_IGN, sa_mask=[HUP], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f7719fd0050}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
2212 rt_sigaction(SIGHUP, {sa_handler=SIG_DFL, sa_mask=[HUP], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f7719fd0050}, <unfinished ...>
2209 rt_sigaction(SIGHUP, {sa_handler=SIG_IGN, sa_mask=[HUP], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f7719fd0050}, <unfinished ...>
2212 rt_sigaction(SIGHUP, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
2212 rt_sigaction(SIGHUP, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
2212 rt_sigaction(SIGHUP, {sa_handler=0x5567ef0cdeb0, sa_mask=~[ILL TRAP ABRT BUS FPE KILL SEGV CONT STOP TSTP TTIN TTOU SYS RTMIN RT_1], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7fb3ba001050}, NULL, 8) = 0
2212 read(3, "<?php\n \n function dummy_handler() { /* deliberately left empty */ }\n pcntl_signal(SIGHUP, 'dummy_handler');\n $input = fgets(STDIN);\n", 4096) = 144
2212 rt_sigaction(SIGHUP, {sa_handler=0x5567ef0cdeb0, sa_mask=~[ILL TRAP ABRT BUS FPE KILL SEGV CONT STOP TSTP TTIN TTOU SYS RTMIN RT_1], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7fb3ba001050}, NULL, 8) = 0
2209 kill(-2212, SIGHUP) = 0
2212 --- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=2209, si_uid=1001} ---
2209 kill(-2212, SIGHUP) = 0
2212 --- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=2209, si_uid=1001} ---
2212 rt_sigaction(SIGHUP, {sa_handler=0x5567ef0cdeb0, sa_mask=~[ILL TRAP ABRT BUS FPE KILL SEGV CONT STOP TSTP TTIN TTOU SYS RTMIN RT_1], sa_flags=SA_RESTORER|SA_INTERRUPT|SA_SIGINFO, sa_restorer=0x7fb3ba001050}, NULL, 8) = 0
2209 kill(-2212, SIGHUP) = -1 ESRCH (No such process)
工作 case (2219为初始):
2220 rt_sigaction(SIGHUP, {sa_handler=SIG_IGN, sa_mask=[HUP], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f6b9ec83050}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
2220 rt_sigaction(SIGHUP, {sa_handler=SIG_DFL, sa_mask=[HUP], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f6b9ec83050}, <unfinished ...>
2219 rt_sigaction(SIGHUP, {sa_handler=SIG_IGN, sa_mask=[HUP], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f6b9ec83050}, <unfinished ...>
2221 rt_sigaction(SIGHUP, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
2221 rt_sigaction(SIGHUP, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
2221 rt_sigaction(SIGHUP, {sa_handler=0x55e3610ddeb0, sa_mask=~[ILL TRAP ABRT BUS FPE KILL SEGV CONT STOP TSTP TTIN TTOU SYS RTMIN RT_1], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7f8e6a25b050}, NULL, 8) = 0
2221 read(3, "<?php\n \n function dummy_handler() { /* deliberately left empty */ }\n pcntl_signal(SIGHUP, 'dummy_handler');\n $input = fgets(STDIN);\n", 4096) = 144
2221 rt_sigaction(SIGHUP, {sa_handler=0x55e3610ddeb0, sa_mask=~[ILL TRAP ABRT BUS FPE KILL SEGV CONT STOP TSTP TTIN TTOU SYS RTMIN RT_1], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7f8e6a25b050}, NULL, 8) = 0
2219 kill(-2220, SIGHUP) = 0
2221 --- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=2219, si_uid=1001} ---
2220 --- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=2219, si_uid=1001} ---
2220 +++ killed by SIGHUP +++
2219 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=2220, si_uid=1001, si_status=SIGHUP, si_utime=0, si_stime=0} ---
2221 --- SIGHUP {si_signo=SIGHUP, si_code=SI_KERNEL} ---
2219 kill(-2220, SIGHUP) = 0
2221 --- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=2219, si_uid=1001} ---
2221 rt_sigaction(SIGHUP, {sa_handler=0x55e3610ddeb0, sa_mask=~[ILL TRAP ABRT BUS FPE KILL SEGV CONT STOP TSTP TTIN TTOU SYS RTMIN RT_1], sa_flags=SA_RESTORER|SA_INTERRUPT|SA_SIGINFO, sa_restorer=0x7f8e6a25b050}, NULL, 8) = 0