AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 101729
Accepted
Lance Roberts
Lance Roberts
Asked: 2010-01-12 14:07:12 +0800 CST2010-01-12 14:07:12 +0800 CST 2010-01-12 14:07:12 +0800 CST

Bourne shell 脚本的 CRON 作业异常行为

  • 772

我有以下脚本,当我在提示符下键入脚本名称(logscript)时,它会正常运行:

#!/bin/sh
dvar=`date +"%m\/%d\/%y"`
filedate=`date +%b%d%Y`
echo DSS1 > serverlog_${filedate}.txt
grep "^$dvar" oasErrLog >> serverlog_${filedate}.txt
echo CMX1 >> serverlog_${filedate}.txt
ssh GVECMX1 grep "^$dvar" /home/gve/log/oasErrLog >> serverlog_${filedate}.txt
echo CMX2 >> serverlog_${filedate}.txt
ssh GVECMX2 grep "^$dvar" /home/gve/log/oasErrLog >> serverlog_${filedate}.txt
echo XIS1 >> serverlog_${filedate}.txt
ssh GVEXIS1 grep "^$dvar" /home/gve/log/oasErrLog >> serverlog_${filedate}.txt
echo XIS2 >> serverlog_${filedate}.txt
ssh GVEXIS2 grep "^$dvar" /home/gve/log/oasErrLog >> serverlog_${filedate}.txt
scp serverlog_${filedate}.txt "GVEXOSR2:C:/Documents\ and\ Settings/gve/Desktop/logs"
#rm serverlog_${filedate}.txt

样本正常输出为:

DSS1
01/11/10 03:00:08.139 XIS run_backupserver - Startup of XISBACKUP backupserver complete.
CMX1
01/11/10 04:30:05.710 OMNICOMM 30274 - boatimesync: error 3 from boaRx rtu 35 pretry 1 {protocols/boa/boa_command.c:601}
01/11/10 04:30:12.117 OMNICOMM 30274 - CRC (0FFC) does not match calculated CRC (03B0) for remote JRS. headerLength=5 dataLength=0 crcByteOffset=2  functionCode=1  {protocols/boa/boa_io.c:1177}    
CMX2
XIS1
XIS2
01/11/10 03:00:10.563 XIS run_backupserver - Startup of XISBACKUP backupserver complete.

但是当我设置一个 CRON 作业时,它运行并 scps 文件,但内容错误,并且文件不在服务器上(当 rm 行被注释掉时,就像我上面显示的那样)。这是我得到的输出,但请注意:输出会发生变化,它的输出会有所不同:

DSS1
CMX1
01/11/10 001/11/10 04:30:05.710 OMNICOMM 30274 - boatimesync: error 3 from boaRx rtu 35 pretry 1 {protocols/boa/boa_command.c:601}
01/11/10 04:30:12.117 OMNICOMM 30274 - CRC (0FFC) does not match calculated CRC (03B0) for remote JRS. headerLength=5 dataLength=0 crcByteOffset=2  functionCode=1  {protocols/boa/boa_io.c:1177}
CMX2
CMX2
CMX2
CMX2
XIS1
XIS1
XIS1
XIS1
XIS2
01/1101/11/10 001/11/10 03:00:10.563 XIS run_backupserver - Startup of XISBACKUP backupserver complete.

关于手动输入命令时为什么 CRON 作业没有像系统运行它一样运行它的任何想法?

编辑: 我已将脚本修改为循环并使用所有绝对寻址,并使用 SHELL、PATH 和 HOME 变量修改了 CRON 文件,但输出仍然不稳定,现在是脚本:

#!/bin/sh

### internal variable definitions
dvar=`date +"%m\/%d\/%y"`
filedate=`date +%b%d%Y`

# add the prefix of new hosts into the string below
# which will be expanded later into GVE(whatever) while looping
HOSTLIST="DSS1 CMX1 CMX2 XIS1 XIS2"

# main Loop
for SUFFIX in $HOSTLIST
do
  echo $SUFFIX >> /home/gve/log/serverlog_${filedate}.txt
  ssh GVE$SUFFIX grep "^$dvar" /home/gve/log/oasErrLog \
    >> /home/gve/log/serverlog_${filedate}.txt
  echo "\n" >> /home/gve/log/serverlog_${filedate}.txt
done

# transfer and delete file
scp /home/gve/log/serverlog_${filedate}.txt \
  "GVEXOSR2:C:/Documents\ and\ Settings/gve/Desktop/logs"
#rm serverlog_${filedate}.txt

这是输出:

DSS1
01/1201/12/10 03:00:08.323 XIS run_backupserver - Startup of XISBACKUP backupserver complete.
1
01/12/101/12/10 00:00:37.003 agc - dbioLower: DNP prev cmd may still in prog, name NPC_GT3_GOV raiseTimeout 1250 lowerTimeout 2500 curtime(1263286837:3) cmd_time(1263286834:807)
01/12/10 02:14:57.545 OMNICOMM 1562 - CRC (F110) does not match calculated CRC (1110) for remote ARS. headerLength=5 dataLength=10 crcByteOffset=7  functionCode=2  {protocols/boa/boa_io.c:1177}


CMX2


XIS1


XIS1


XIS2
01/12/101/12/10 03:00:10.408 XIS run_backupserver - Startup of XISBACKUP backupserver complete.

请注意某些行上的混乱日期,“1”而不是“CMX1”和被欺骗的“XIS1”。

最终编辑:

看起来 CRON 不知何故催生了多个相互绊倒的进程。在杀死所有适用的进程后,它理顺了。CRON 有错误的多进程生成的历史(如果您对其进行一些网络搜索),所以要小心。

scripting unix cron bourne-shell
  • 2 2 个回答
  • 931 Views

2 个回答

  • Voted
  1. Avery Payne
    2010-01-12T14:48:51+08:002010-01-12T14:48:51+08:00

    CRON 确实有自己的环境。

    您是否使用 crontab -e 作为运行作业的用户安装了作业?工作是如何添加的?

    此外,稍微重做脚本,循环;这应该可以在您的设置上正常工作。

    #!/bin/sh
    
    ### internal variable definitions
    dvar=`date +"%m\/%d\/%y"`
    filedate=`date +%b%d%Y`
    
    # add the prefix of new hosts into the string below,
    # which will be expanded later into GVE{whatever} while looping
    HOSTLIST="DSS1 CMX1 CMX2 XIS1 XIS2"
    
    # main processing loop
    for SUFFIX in $HOSTLIST
    do
      echo $SUFFIX >> serverlog_${filedate}.txt     
      ssh GVE$SUFFIX grep "^$dvar" /home/gve/log/oasErrLog \
        >> serverlog_${filedate}.txt
    done
    
    scp serverlog_${filedate}.txt \
      "GVEXOSR2:C:/Documents\ and\ Settings/gve/Desktop/logs"
    

    第二次尝试的后续行动:

    好的,所以有些东西肯定是吓坏了。您获得 2x XIS1 的事实很好地表明缓冲区没有被正确写入,或者外壳本身就是罪魁祸首。循环应该在运行时隔离每个主机,所以除非你有未冲洗的管道/缓冲区/你有什么,它不应该连续显示 XIS1 两次。尝试明确地使用#!/bin/bashas shell 而不是 sh,有时供应商会将 sh 重新挂钩到 bash 以外的东西(并且循环是 bash 主义,因此可能会导致问题)。另外,在脚本中的sync前面加上一个done,看看它是否是一个缓冲问题。

    • 3
  2. Best Answer
    Michael Graff
    2010-01-12T15:21:12+08:002010-01-12T15:21:12+08:00

    cron 的第一条规则是设置您期望的几件事。一,你在哪个目录(明确地'cd'到它)。二,您期望的路径(在 crontab 中,PATH=...)和三,邮件的去向(如果您想更改它。)

    例如:

    SHELL=/bin/sh
    PATH=/bin:/sbin:/usr/bin:/usr/sbin
    HOME=/var/log
    

    然后,如果需要,我还会让每个脚本设置额外的路径,并且总是

    cd $HOME
    

    或到另一个显式路径。

    • 3

相关问题

  • 知道任何适用于 Windows 的快速可编写脚本的 ftp 客户端吗?[关闭]

  • 如果同一个任务已经在运行,如何防止计划任务运行?

  • 需要从 Batch For 循环中排除特定结果

  • Bash 脚本:要求脚本以 root 身份运行(或使用 sudo)

  • 从命令行删除旧的(非引导)Windows Vista 目录

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve