热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

由crontab执行expect脚本问题引发的--crontab环境变量问题

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

   手头上有一个远程重启目标服务器上进程的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


推荐阅读
  • #!binbash########################################################################## File Name : rsync_nobody.sh#  ... [详细]
  • Jenkins教程:使用Jenkins进行持续集成
    【注】本文译自:https:www.edureka.coblogjenkins-tutorial本文将重点介绍Jenkins架构和Jenkins构建管道,并向您展示如何在Jenki ... [详细]
  • 阿里云mysql性能,阿里云mysql性能
    本文目录一览:1、mysqld占用CPU过高是什么原因 ... [详细]
  • 服务器上的nginx使用logrotate来分割日志,设置为每天分割。但是logrotate似乎没有工作,日志并没有分割。服务器是CentOS6。为了找到原因 ... [详细]
  • 前言crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用crontab,那么任务就是常驻程序,这对你的程序要求比较 ... [详细]
  • ssh登陆服务器,切换为有权限的用户比如sudosuazhibocrontab-l查看所有现有的命令使用crontab-e编辑定时任务,定时任务比如:04*** ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了markdown[软件代理设置]相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • 一·计划任务1)at1.确定at安装chkconfig–list|grepatd启动at服务:serviceatdrestart2.访问控制如果系统中有etc ... [详细]
  • 用.sh文件来完成任务,但现在有个项目直接用url就行。一般系统不会有crontabShell#安装crontab:yuminstallcronta ... [详细]
  • 【场景】:需要定期运行Hadoop的MapReduce【解决办法】:编写一个运行MapReduce的Shell脚本。然后使用crontab配置定时任务。【Shell脚本】 ... [详细]
  • 记录一次ali云线上环境jenkins被攻击挖矿的处理过程
    周六告警一个接一个,感觉极不寻常netstat-anpd执行结果如下久违的中毒感觉,查看一下各用户下的crontabcatetcpasswd|cut-f1-d:|xargs-I{} ... [详细]
author-avatar
blg1202702934392
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有