Linux“at”命令在从shell运行时工作正常,但从webserver运行时失败

时间:2014-07-14 23:31:33

标签: php linux apache bash shell

我正在使用" at"为了设置用户在RHEL6.4上设置的未来操作。 我在php中使用的命令是

exec("echo \"php $script_path\" | at $run_time");

其中脚本路径已设置为运行时。当我从一个用php -a启动的shell运行时,这可以100%正常工作。当它从Web服务器运行时,作业就会被创建,但它似乎并没有运行。

  1. 我已经验证:apache用户具有完整的读写执行权     访问目录和其中的所有文件夹。

  2. exec命令     正在运行(毕竟创建了at作业。)

  3. 我已经验证了     工作正在服务器上寻找正确的路径。

  4. 我不知道我还能做些什么来获得正确运行脚本的命令。有什么建议吗?

    感谢您的帮助。


    更新: 我继续创建了一个链接到脚本的页面,我尝试自动运行并以这种方式启动它。当这种方式运行时,脚本本身运行正常,这意味着它绝对是" at"是在做。我运行了print_r($ _ ENV)来确定正在使用的环境变量。唯一显示的是数字1.


    更新2: 我在每个工作上运行了一个-c,一个似乎永远不会运行的工作,以及一个工作正常的工作。似乎有更多的内容在那个有效的VS和那个没有的东西上。 65工作(从shell运行)

    at -c 65
    #!/bin/sh
    # atrun uid=0 gid=0
    # mail root 0
    umask 22
    HOSTNAME=ipdb-sys.ipdb.lab; export HOSTNAME
    SHELL=/bin/bash; export SHELL
    HISTSIZE=1000; export HISTSIZE
    SSH_CLIENT=143.166.167.124\ 53008\ 22; export SSH_CLIENT
    QTDIR=/usr/lib64/qt-3.3; export QTDIR
    QTINC=/usr/lib64/qt-3.3/include; export QTINC
    SSH_TTY=/dev/pts/0; 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
    WEBROOT=/var/www; export WEBROOT
    MAIL=/var/spool/mail/root; export MAIL
    PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/dell/srvadmin/bin:/opt/dell/srvadmin/sbin:/root/bin; export PATH
    PWD=/root; export PWD
    LANG=en_US.UTF-8; export LANG
    MODULEPATH=/usr/share/Modules/modulefiles:/etc/modulefiles; export MODULEPATH
    LOADEDMODULES=; export LOADEDMODULES
    HISTCONTROL=ignoredups; export HISTCONTROL
    SHLVL=1; export SHLVL
    HOME=/root; export HOME
    LOGNAME=root; export LOGNAME
    QTLIB=/usr/lib64/qt-3.3/lib; export QTLIB
    CVS_RSH=ssh; export CVS_RSH
    SSH_CONNECTION=143.166.167.124\ 53008\ 10.180.57.93\ 22; export SSH_CONNECTION
    MODULESHOME=/usr/share/Modules; export MODULESHOME
    LESSOPEN=\|/usr/bin/lesspipe.sh\ %s; export LESSOPEN
    G_BROKEN_FILENAMES=1; export G_BROKEN_FILENAMES
    module=\(\)\ {\ \ eval\ \`/usr/bin/modulecmd\ bash\ \$\*\`"
    "}; export module
    cd /root || {
             echo 'Execution directory inaccessible' >&2
             exit 1
    }
    ${SHELL:-/bin/sh} << 'marcinDELIMITER145f56ce'
    php /var/www/ipdb5.0/unattend/release.php
    
    marcinDELIMITER145f56ce
    

    Job 68没有。

    at -c 68
    #!/bin/sh
    # atrun uid=48 gid=48
    # mail apache 1
    umask 22
    PATH=/sbin:/usr/sbin:/bin:/usr/bin; export PATH
    RUNLEVEL=3; export RUNLEVEL
    runlevel=3; export runlevel
    PWD=/var/www/ipdb5.0/run; export PWD
    LANGSH_SOURCED=1; export LANGSH_SOURCED
    LANG=C; export LANG
    PREVLEVEL=N; export PREVLEVEL
    previous=N; export previous
    CONSOLETYPE=vt; export CONSOLETYPE
    SHLVL=4; export SHLVL
    UPSTART_INSTANCE=; export UPSTART_INSTANCE
    UPSTART_EVENTS=runlevel; export UPSTART_EVENTS
    UPSTART_JOB=rc; export UPSTART_JOB
    cd /var/www/ipdb5\.0/run || {
             echo 'Execution directory inaccessible' >&2
             exit 1
    }
    ${SHELL:-/bin/sh} << 'marcinDELIMITER348f4254'
    php /usr/bin/php /var/www/ipdb5.0/unattend/release.php
    
    marcinDELIMITER348f4254
    

    不要知道你们是否能比我更能解决这个问题,但我觉得发帖后不会有什么伤害。

1 个答案:

答案 0 :(得分:3)

终于找到了答案。事实证明,你需要三件事,而我之前没有设置过。

  1. 您需要拥有正在调用的程序的绝对路径 (php必须是/ usr / bin / php) - 谢谢mti2935。
  2. 您需要为apache用户设置shell。 - 谢谢 让我开始这个方向craniumonempty。命令 我必须跑:sudo chsh -s /bin/bash username
  3. 最后,您必须使用。创建一个at.allow文件 www-data组和apache用户。 (确保没有 at.deny文件,因为这将抵消允许。)。
  4. 设置完所有这些后,at将从您的网络服务器成功运行。另外,一定要掌握我在主帖中介绍的基础知识。为正在运行的脚本提供对apache的读/写/执行,确保脚本本身无需运行就可以运行,并验证正在创建at作业。

    谢谢大家的帮助。