由于工作的关系需要维护一些windows2003服务器,要执行一些脚本操作,没法子BAT不会,就只会shell,怎么办呢?有办法的,接下来我给大家介绍一整套利用shell维护windows服务器的办法。
首先去首页下载setup.exe,安装的时候注意默认是不会安装 cygrunsrv 和 cron 这2个程序的,所以大家要在Admin项里把这2个程序安装上,顺便在Editer项里把vim也装上吧。话说cygwin下的vim还真不太好用。
安装完成后启动cygwin程序,熟悉吧,跟shell一样的界面和操作。这时候我得到的任务是需要自动化处理:定时移动目录A下的90天前的以8位日期为文件名的文件夹到目录B中。这个问题不太难,判断目录名称是否小于90天前的那个日期,用shell来说不太难。但是这个cygwin也就是Windows下的一个程序,如何让它定时运行脚本呢?原来cygwin自己有建立在windows下的启动服务,通过这个cron服务,就跟我们在Linux下定植crontab是一样的了。在安装cron服务中遇到了不少的挫折,查询了好多资料才搞定。关键的问题,一般服务器的Administrator肯定设有密码的,所以这个时候要配置cron服务并以验证密码以管理员权限登陆才能启动cron,大家按照下面的提示操作:
$ cron-config
Do you want to install the cron daemon as a service? (yes/no) yes
Enter the value of CYGWIN for the daemon: [ ] ntsec
Do you want the cron daemon to run as yourself? (yes/no) yes
Please enter the password for user 'Administrator':键入密码
Reenter:再次键入密码
这时候在系统的服务里可以看到 Cron daemon 和 cygserver 这两个进程已经成功启动了。然后再在cygwin里启动该服务:
- # 启动 cygserver
- cygrunsrv -I cygserver -p /usr/sbin/cygserver -e "CYGWIN=server"
启动 cron 以后,即使关闭cygwin命令窗口,cron还是会继续运行,而且默认是自动启动的服务,重启机器以后依然运行—不需要开cygwin我们定制的crontab计划一样照常运行,这样的话我们就可以在windows下利用shell的强大功能来维护系统了,BAT?咱不需要了。
对于系统管理员没有密码的系统也按照上面的设置,密码随便键入,到时候再去服务里找到 Cron daemon 项再改为本地系统账户,然后再启动2个服务器就行了。
总算是把cygwin的cron搞定了,我们接着还要搞定crontab,下面我引入前人对crontab环境变量的总结:
原文在此:
1. crontab与环境变量
不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:
1)脚本中涉及文件路径时写全局路径;
2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
2. 其他应该注意的问题
1)新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。
2)每条 JOB 执行完毕之后,系统会自动将输出发送邮件给当前系统用户。日积月累,非常的多,甚至会撑爆整个系统。所以每条 JOB 命令后面进行重定向处理是非常必要的: >/dev/null 2>&1 。前提是对 Job 中的命令需要正常输出已经作了一定的处理, 比如追加到某个特定日志文件。
3)当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。
4)千万别乱运行crontab -r 它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。
5)在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date '+%Y%m%d'在crontab里是不会执行的,应该换成date '+\%Y\%m\%d'。
- $ crontab -l
- 0 3 * * * source /etc/profile;/cygdrive/d/cpdir.sh
- #!/bin/bash
- /usr/bin/find /cygdrive/e/test -mindepth 1 -type d | /usr/bin/awk -F'/' -vd=$(/usr/bin/date -d "-90 days" +\%Y\%m\%d) 'NF{if($5<d){system("mv "$0" /cygdrive/f/test/")}}'
有了以上的帮助,哈哈顺利完成任务!
再来个更简单的吧,可以利用windows的计划任务运行以下DOS命令:
- C:\cygwin\bin\bash.exe -l -c "/cygdrive/d/cpdir.sh"
好吧,用我们的shell去维护WIN吧。
阅读(3126) | 评论(0) | 转发(0) |