【问题标题】:UNIX shell script fails when ran as a scheduled taskUNIX shell 脚本在作为计划任务运行时失败
【发布时间】:2016-12-04 17:54:39
【问题描述】:

我遇到了 1 个小问题,即 shell 脚本未能执行 IF 语句中列出的命令之一。

如果您打开终端窗口并复制\粘贴整个脚本,该脚本将 100% 正常运行。

如果你只是通过调用它来运行脚本,那么一切都会运行除了这一行,你会在最底部看到:

回显 $newID > $fileID

环境是运行 GitBASH 的 Windows Server 2012。 (这将解释 C:/ 文件路径)

与将代码复制\粘贴到终端相比,为什么脚本仅在作为“脚本”运行时无法执行该 1 任务的任何想法?


这是整个脚本。 谢谢

# Clean directory
cd C:/Scripts/Shoretel_Export/
rm -f C:/Scripts/Shoretel_Export/output/*.csv

# <---- Define: Date variables (not all dates used but available if needed \ just modify the wget string) ----> #

twoDaysAgo=$(date +%Y-%m-%d -d '2 days ago')
yesterday=$(date +%Y-%m-%d -d 'yesterday')
today=$(date +%Y-%m-%d)
tomorrow=$(date +%Y-%m-%d -d 'tomorrow')

# <---- Define: Date timestamp variables for file naming ----> #
stampTwoDaysAgo=$(date +%m-%d-%Y -d '2 days ago')
stampTomorrow=$(date +%m-%d-%Y -d 'tomorrow')

# <---- Define: Credentials variable  ----> #
account="--http-user=APIuser --http-password=APIpassword"

# <---- Define: Export output directory variable  ----> #
sourceFile="C:/Scripts/Shoretel_Export/output/currentLastID.csv"
output=$"C:/Scripts/Shoretel_Export/output/"${stampTwoDaysAgo}"_"${stampTomorrow}".csv"
tempIDsource=$"C:/Scripts/Shoretel_Export/output/archive/"${stampTwoDaysAgo}"_"${stampTomorrow}".csv"

# <---- Define: Export lastID variable  ----> #
callID=$(awk -F'","|^"|"$' 'BEGIN { max=0 } $1 > max { max=$1 } END {print max}' "C:/Scripts/Shoretel_Export/output/ID/ID.txt")

# <---- Execute WGET function to export Shoretel calls from the specified date range ----> #
wget --auth-no-challenge --no-check-certificate --output-document=${output} "https://portal.shoretelsky.com/DataExport/CDRData?startDate=${twoDaysAgo}&endDate=${tomorrow}&lastId=${callID}" ${account}

# Perform empty file validation, if file is 0 kb the script will terminate and retry
if [ -s "$output" ]
then
    echo "File is not empty continue to next IF statement"
else
    ./retry.sh
fi


#### At this point we should have a valid file 1 kb or larger. If the export contains 0 new records the script will terminate and the previous callID will remain ####

# Define tempID to check for invalid or empty ID field
tempID=$(awk -F'","|^"|"$' 'BEGIN { max=0 } $18 > max { max=$18 } END {print max}' $output)

# Define ID paramaters and rename files
fileID="C:/Scripts/Shoretel_Export/output/ID/ID.txt"

if [ "$tempID" -gt "$callID" ]
then
    cp $output C:/Scripts/Shoretel_Export/output/archive/
    mv $output $sourceFile
    newID=$(awk -F'","|^"|"$' 'BEGIN { max=0 } $18 > max { max=$18 } END {print max}' $tempIDsource)
    echo $newID > $fileID
    echo "Export and Timestamp complete"
else
    echo "Export contains 0 new call records \ the script will now terminate"
fi

【问题讨论】:

  • 确保它使用您在控制台中运行时使用的同一用户作为计划任务运行。或者确保System 用户(或任何运行计划任务的用户;我手头没有Windows 系统)拥有写入文件所需的权限。
  • 我知道 Windows 任务一定有问题。我将更新问题以显示我是如何工作的。感谢您的意见!

标签: linux bash shell variables wget


【解决方案1】:

已解决: 问题出在 Windows 中的计划任务上。这是我为使其正常工作所做的工作。

任务计划程序 > 将计划修改为:启动程序 > 程序/脚本: cmd 添加参数(可选):/K C:\Scripts\Shoretel_Export\Shoretel-Export.sh & 退出


【讨论】:

  • 如果是这样,您应该将问题标记为已回答:-)
【解决方案2】:

不确定它是否可以在 Windows 上运行,但您应该尝试在调试模式下执行脚本:

#!/bin/bash -x

所以你可以逐行检查发生了什么。 你也可以显示这个脚本的输出吗?

【讨论】:

  • 脚本的输出是一个通话记录 .csv 文件。没什么特别的,但它包含我认为是机密的信息,所以我不能分享它。我试过了。如果您已经打开终端窗口并运行“bash -x ./Export.sh”,则脚本将完成而不会出现任何问题。只有当脚本无头运行时,它才会无法通过 ECHO > 命令执行该 1 .txt 文件更新。
猜你喜欢
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 2014-11-19
  • 1970-01-01
相关资源
最近更新 更多