使用exec()函数执行Linux下的at命令

瓜皮猫 2017-12-15 06:06:19
环境:centOS 6.8;php7.1.12;nginx1.12.2;

<?php
ini_set("display_errors","on");

exec("
at now + 5 minutes
echo 1 > /usr/local/nginx/html/test.txt
",
$output,
$return_var
);
var_dump($output);
if($return_var===0){
echo "Successed.\n";
}else{
echo "Fail.Error code is $return_var \n";
}
exit();


以上代码访问后可以生成at任务,使用at -c查看内容,如下:

#!/bin/sh
# atrun uid=99 gid=99
# mail nobody 0
umask 22
USER=nobody; export USER
PWD=/usr/local/nginx/html; export PWD
SHLVL=1; export SHLVL
HOME=/; export HOME
cd /usr/local/nginx/html || {
echo 'Execution directory inaccessible' >&2
exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER07ebc08c'

marcinDELIMITER07ebc08c

结果到指定时间后无法执行,一直会保留在at的列表中。
————————————————————————分割线————————————————————————

# at now + 5 minutes
at> echo 1 > /usr/local/nginx/html/test.txt
at><EOT>

以上代码可以生成at任务,使用at -c查看内容,如下:

#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
HOSTNAME=VM_0_7_centos; export HOSTNAME
SHELL=/bin/bash; export SHELL
HISTSIZE=3000; export HISTSIZE
SSH_CLIENT=221.235.84.162\ 49547\ 22; export SSH_CLIENT
SSH_TTY=/dev/pts/1; export SSH_TTY
USER=root; export USER
LS_COLORS=rs=0:di=01\;34:ln=01\;36:mh=00:pi=40\;33:so=01\;35:do=01\;35:bd=40\;33\;01:cd=40\;33\;01:or=40\;31\;01:mi=01\;05\;37\;41:su=37\;41:sg=30\;43:ca=30\;41:tw=30\;42:ow=34\;42:st=37\;44:ex=01\;32:\*.tar=01\;31:\*.tgz=01\;31:\*.arj=01\;31:\*.taz=01\;31:\*.lzh=01\;31:\*.lzma=01\;31:\*.tlz=01\;31:\*.txz=01\;31:\*.zip=01\;31:\*.z=01\;31:\*.Z=01\;31:\*.dz=01\;31:\*.gz=01\;31:\*.lz=01\;31:\*.xz=01\;31:\*.bz2=01\;31:\*.tbz=01\;31:\*.tbz2=01\;31:\*.bz=01\;31:\*.tz=01\;31:\*.deb=01\;31:\*.rpm=01\;31:\*.jar=01\;31:\*.rar=01\;31:\*.ace=01\;31:\*.zoo=01\;31:\*.cpio=01\;31:\*.7z=01\;31:\*.rz=01\;31:\*.jpg=01\;35:\*.jpeg=01\;35:\*.gif=01\;35:\*.bmp=01\;35:\*.pbm=01\;35:\*.pgm=01\;35:\*.ppm=01\;35:\*.tga=01\;35:\*.xbm=01\;35:\*.xpm=01\;35:\*.tif=01\;35:\*.tiff=01\;35:\*.png=01\;35:\*.svg=01\;35:\*.svgz=01\;35:\*.mng=01\;35:\*.pcx=01\;35:\*.mov=01\;35:\*.mpg=01\;35:\*.mpeg=01\;35:\*.m2v=01\;35:\*.mkv=01\;35:\*.ogm=01\;35:\*.mp4=01\;35:\*.m4v=01\;35:\*.mp4v=01\;35:\*.vob=01\;35:\*.qt=01\;35:\*.nuv=01\;35:\*.wmv=01\;35:\*.asf=01\;35:\*.rm=01\;35:\*.rmvb=01\;35:\*.flc=01\;35:\*.avi=01\;35:\*.fli=01\;35:\*.flv=01\;35:\*.gl=01\;35:\*.dl=01\;35:\*.xcf=01\;35:\*.xwd=01\;35:\*.yuv=01\;35:\*.cgm=01\;35:\*.emf=01\;35:\*.axv=01\;35:\*.anx=01\;35:\*.ogv=01\;35:\*.ogx=01\;35:\*.aac=01\;36:\*.au=01\;36:\*.flac=01\;36:\*.mid=01\;36:\*.midi=01\;36:\*.mka=01\;36:\*.mp3=01\;36:\*.mpc=01\;36:\*.ogg=01\;36:\*.ra=01\;36:\*.wav=01\;36:\*.axa=01\;36:\*.oga=01\;36:\*.spx=01\;36:\*.xspf=01\;36:; export LS_COLORS
MAIL=/var/spool/mail/root; export MAIL
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin; export PATH
PWD=/root/soft; export PWD
LANG=en_US.utf8; export LANG
SHLVL=1; export SHLVL
HOME=/root; export HOME
LOGNAME=root; export LOGNAME
SSH_CONNECTION=221.235.84.162\ 49547\ 172.16.0.7\ 22; export SSH_CONNECTION
LESSOPEN=\|\|/usr/bin/lesspipe.sh\ %s; export LESSOPEN
PROMPT_COMMAND=history\ -a\;\ printf\ \"\\033]0\;%s@%s:%s\\007\"\ \"\${USER}\"\ \"\${HOSTNAME%%.\*}\"\ \"\${PWD/#\$HOME/\~}\"; export PROMPT_COMMAND
HISTTIMEFORMAT=%F\ %T\ ; export HISTTIMEFORMAT
G_BROKEN_FILENAMES=1; export G_BROKEN_FILENAMES
OLDPWD=/root; export OLDPWD
cd /root/soft || {
echo 'Execution directory inaccessible' >&2
exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER08747cb4'
echo 1 > /usr/local/nginx/html/test.txt

marcinDELIMITER08747cb4

结果可以顺利到点执行。
我个人也发现了这两个之间的区别,但是苦于原因无从查起。所以劳烦来各位大牛指点。

最近个人在学习Linux相关知识,对linux监视计划任务的配置文件并不了解,想请各位大佬指点一下。
无论是Linux下相关的日志,可以查看at不执行原因;
或者at在exec函数中的规范格式写法;
都请帮忙指点一下我。感谢各位大牛。
...全文
440 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_32278153 2019-10-14
  • 打赏
  • 举报
回复
apache 账号 默认禁止登入 改下 就可以了
瓜皮猫 2017-12-25
  • 打赏
  • 举报
回复
厚颜无耻的自顶一发。
瓜皮猫 2017-12-19
  • 打赏
  • 举报
回复
引用 3 楼 qq_34399969 的回复:
exec("at now + 5 minutes  echo 1 > /usr/local/nginx/html/test.txt 2>&1 ", $output, $return_var);
吧错误重定向下,在打印$output 看看错误信息

<?php
ini_set("display_errors","on");

exec("
at now + 5 minutes 
  echo 1 > /usr/local/nginx/html/test.txt 2>&1
 ",
 $output,
 $return_var
);
var_dump($output);
if($return_var===0){
 echo "Successed.\n";
}else{
 echo "Fail.Error code is $return_var \n";
}
exit();

以下是操作代码和返回值。

[root@VM_0_7_centos ~]# atq
[root@VM_0_7_centos ~]# curl 127.0.0.1/index.php
array(0) {
}
Successed.
[root@VM_0_7_centos ~]# atq
16	2017-12-19 16:13 a nobody
[root@VM_0_7_centos ~]# at -c 16
#!/bin/sh
# atrun uid=99 gid=99
# mail nobody 0
umask 22
USER=nobody; export USER
PWD=/usr/local/nginx/html; export PWD
SHLVL=1; export SHLVL
HOME=/; export HOME
cd /usr/local/nginx/html || {
	 echo 'Execution directory inaccessible' >&2
	 exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER18925f78'

marcinDELIMITER18925f78
没有报错,且创建at任务成功,但是依然是无内容,感觉很奇怪- -。
瓜皮猫 2017-12-18
  • 打赏
  • 举报
回复
感谢回复,是这样的: 我在linux下查找/etc/at.allow是不存在的,/etc/at.deny内容是空的。 这样的话,那应该是所有的用户都是可以添加at任务的把?(事实也是能够添加任务的) 我将/usr/local/nginx/html目录,也就是我在程序中写的目录的权限因为考虑到php运行用户的nobody,所以已经给了777权限。 现在问题的表象是php代码并没有成功的将at后的指令插入到at任务体中, 我个人认为是php函数使用at指令格式问题导致命令录入丢失。 不知你意下如何?
老虎爱代码 2017-12-18
  • 打赏
  • 举报
回复
exec("at now + 5 minutes  echo 1 > /usr/local/nginx/html/test.txt 2>&1 ", $output, $return_var);
吧错误重定向下,在打印$output 看看错误信息
傲雪星枫 2017-12-17
  • 打赏
  • 举报
回复
估计没有权限,你可以看看生成的at的权限是什么。改为777试试。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧