免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3147 | 回复: 11
打印 上一主题 下一主题

还是crontab的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-09 18:35 |只看该作者 |倒序浏览
各位DX,我知道crontab的问题大多数都是环境变量的问题,我也在cu以及google上搜索过了,但我的cron脚本还是达不到我预想的效果。具体现象如下:
1。该脚本的目的是运行系统的一个带参数的命令(clish -c statistics c1),结果返回一些统计值,然后将此统计值写入一文件
2。手动执行这个shell脚本是没问题的
3。将脚本加入到crontab后,执行是没问题的,message里也没报任何错误,但文件内只写入了tab字符,好像pdpc1和pdpc2的值都是空的。
4。脚步中所有的命令都使用了绝对路径。


# crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.21146 installed on Tue Jan  9 17:28:04 2007)
# (Cron version -- $Id: crontab.c,v 1.3 2001/08/08 17:31:21 ali Exp $)
19,29 * * * * /var/admin/checkpdpc


  1. #!/bin/sh
  2. CLISH=/bin/clish
  3. GREP=/usr/bin/grep
  4. AWK=/usr/bin/awk
  5. DATE=/bin/date
  6. ECHO=/bin/echo

  7. pdpc1=`$CLISH -c "show statistics c1" | $GREP "Active" | $AWK '{print $4}'`
  8. pdpc2=`$CLISH -c "show statistics c2" | $GREP "Active" | $AWK '{print $4}'`

  9. $ECHO "$pdpc1                $pdpc2" >> /var/admin/pdpc.txt
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-01-09 19:13 |只看该作者
clish是脚本吗?
可以在调用前source一下能正常运行的用户的启动脚本试试,如.bash_profile .bashrc之类。

论坛徽章:
0
3 [报告]
发表于 2007-01-09 19:45 |只看该作者
/bin/clish有可能使用某些环境变量,找到这些变量,加到您的脚本中。注意,这些变量必须export。

论坛徽章:
0
4 [报告]
发表于 2007-01-09 21:05 |只看该作者
原帖由 woodie 于 2007-1-9 19:13 发表
clish是脚本吗?
可以在调用前source一下能正常运行的用户的启动脚本试试,如.bash_profile .bashrc之类。

/bin/clish有可能使用某些环境变量,找到这些变量,加到您的脚本中。注意,这些变量必须export。


谢谢二位的回复!
to woodie:
clish是一个二进制文件,不是脚本。
对于“可以在调用前source一下能正常运行的用户的启动脚本试试,如.bash_profile .bashrc之类” ,您是说如果是脚本的话就可以用source一下吗?

to 一梦如是:
请问如何能找到这些变量呢?

论坛徽章:
0
5 [报告]
发表于 2007-01-09 21:36 |只看该作者
原帖由 一梦如是 于 2007-1-9 19:45 发表
/bin/clish有可能使用某些环境变量,找到这些变量,加到您的脚本中。注意,这些变量必须export。

我刚才说的还不够全面,grep、awk、date、echo这些命令的行为也可能受到环境变量的影响,可以通过ltrace的信息grep getenv来找,不过挨个找起来太麻烦了。

一般的做法是将您当前shell用到的profile类文件(注意包括/etc/profile)都找出来,把相关终端属性设置的一些内容去除,剩下的内容都集成进一个文件,譬如叫~/.crontab.env
然后每一个脚本第二行都执行下面这句,将环境变量及一些alias、builtin设置引入
  1. . ~/.crontab.env
复制代码

但有的系统这些文件很分散,搜集起来可能比较麻烦。那就启动一个“干净”的shell终端(没进行过任何赋值操作)
  1. set >~/.crontab.env
复制代码

编辑一下这个文件,每行都加上export,以后每个需要crontab执行的脚本都在第二行加上
  1. . ~/.crontab.env
复制代码
就基本大功告成了,不过想使用alias的话,还要自己将alias的内容自己加到环境文件中。

论坛徽章:
0
6 [报告]
发表于 2007-01-09 23:59 |只看该作者
非常详细的指导!谢谢!
我明天再试一下!

论坛徽章:
0
7 [报告]
发表于 2007-01-10 16:37 |只看该作者
一梦如是,你好!
今天参照你的指导,修改了一下我的脚本,发现还是不行。因为我使用的设备的os是一个基于FreeBSD且经过修改的系统,一些命令和你提到的不大一样,比如set命令,在此系统上的输出如下,感觉并不是设置环境变量的,所以我用了env命令代替了set。最终生成了一个.login的文件。然后在脚本的第二行加入一下语句:

. /var/admin/.login

但在cron执行脚步时,在messages报告了错误,错误信息发到了admin的mail里,信息如下:

To: root
Subject: Cron <root@SZH> /var/admin/checkpdpc
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/var/admin>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>

tset: standard error: Operation not supported
stty: stdin isn't a terminal
setenv: not found

各位大侠还有什么建议?

论坛徽章:
0
8 [报告]
发表于 2007-01-10 17:20 |只看该作者
这些出错的命令是您原先脚本中的还是新创建的.login文件中的?
tset和stty都是设置终端的命令,不应当放到cron的环境变量里,因为cron启动的进程没有控制终端
setenv没有写全路径?

另外可能还要从.login中去除一些只读变量的语句
提醒一下,您在.login文件中export了么?

论坛徽章:
0
9 [报告]
发表于 2007-01-11 16:48 |只看该作者
谢谢一梦如是,终于搞定了。

可能是系统不支持“ . ~/..login”这种方法,我把这行去掉,将.login 里的东西直接拷贝到checkpdpc里头去,就可以了。

按照我自己的理解,. ~/.crontab.env应该是执行.crontab.env这个脚本,但为什么要在"."后面加个空格呢?

论坛徽章:
0
10 [报告]
发表于 2007-01-11 16:52 |只看该作者
(this ".")=source
看十三问第六问

[ 本帖最后由 一梦如是 于 2007-1-11 16:56 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP