zoukankan      html  css  js  c++  java
  • 由crontab执行expect脚本问题引发的crontab环境变量问题

       手头上有一个远程重启目标服务器上进程的expect脚本,SHELL下单独执行时一切都OK,但是添加到cron任务中时执行却不能工作。部分代码如下: 

    expect脚本:(/data/home/restart_expect)

          #!/usr/bin/expect

          spawn ssh -p xxx root@xxx.xxx.xxx.xxx

          #expect "*root's password*"
          expect "*Tencent:*"

          send "sh some remote scripts"
          send "exit/n"

          expect eof exit 0

    crontab任务:

          */5 * * * * /data/monitor/new_itil_dicts/syn_tcms_data/run_syn.php /tmp/test.log 2>/dev/null

    shell下单独执行一切没有问题,放到cron中却不行,开始定位问题。以下是整个过程:

    1. 首先修改crontab的任务错误输出到一个执行文件

           */5 * * * * /data/monitor/new_itil_dicts/syn_tcms_data/run_syn.php /tmp/test.log 2>&1

    2.查看文件/tmp/test.log上的错误输出提示如下

           找不到命令 ssh,这就让我有点纳闷,为啥会找不到 ssh命令(我装在/usr/local/bin目录下)呢,echo $PATH /usr/local/bin目录明明就在PATH中,这时想到是不是cron用的环境变量和shell的不一样,于是google之,发现cron在/etc/crontab中有如下内容:

           SHELL=/bin/sh
           PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin
           MAILTO=root
          #
          # check scripts in cron.hourly, cron.daily, cron.weekly, and cron.monthly
          #

    注意这里PATH变量发现ssh安装目录并不在这个上面,到这里就知道原来是cron和shell使用不同的PATH变量导致的问题。所以解决办法可以是:

    1. 修改/etc/crontab的PATH变量,使包含expect中使用的命令如ssh

           SHELL=/bin/sh
           PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin:/usr/local/bin
           MAILTO=root

    2. expect脚本使用命令的完整路径如,

           #!/usr/bin/expect

          spawn /usr/local/bin/ssh -p xxx root@xxx.xxx.xxx.xxx

          #expect "*root's password*"
          expect "*Tencent:*"

          send "sh some remote scripts"
          send "exit/n"

          expect eof exit 0

  • 相关阅读:
    jstl核心标签库
    乱码的解决
    eclipse 中 Servlet 模板代码(其实是代码提示模板)
    因为最近一直在和数据库打交道,所以做了几个小封装
    意外发现的大批量导入数据SqlBulkCopy类
    Http相关
    Tomcat相关
    对于反射中的invoke()方法的理解
    SqlCommandBuilder类是如何构建T-Sql语句
    模拟在内存中的数据库DataSet相关的类
  • 原文地址:https://www.cnblogs.com/google4y/p/2944410.html
Copyright © 2011-2022 走看看