【问题标题】:Issue with shell script running on crontab \n doesnt work在 crontab 上运行的 shell 脚本问题 \n 不起作用
【发布时间】:2019-06-30 04:54:26
【问题描述】:

我正在执行一项 cron 任务,如果需要,我会检查和恢复 ark 文件。我需要获得 .ark 文件的最大文件大小,如果 .TheIsland.ark 文件较小,它将自动备份并复制最大大小。现在,当我在 crontab 中解决这个问题时,脚本的一部分失败了。

即:

actualmap=$(find $PWD -type f -printf '%p\n' -name "*.ark"| sort -nr | head -1)

如果我删除 \n 它实际上可以工作,但是它不能在它们之间排序,因为它不在单独的行中。

我在使用 \n 的 cron 作业中得到的输出是:

/srv/daemon-data/da4aaa1b-0ce9-46d2-bd60-5f599cc089ae/ShooterGame/Saved/recovery.sh (which is the recovery script)

在终端中运行的同一行代码会产生正确的输出:

/srv/daemon-data/da4aaa1b-0ce9-46d2-bd60-5f599cc089ae/ShooterGame/Saved/SavedArks/TheIsland_NewLaunchBackup.bak

没有 \n 使用 crontab 我得到:

/srv/daemon-data/da4aaa1b-0ce9-46d2-bd60-5f599cc089ae/ShooterGame/Saved/SavedArks/TheIsland_27.06.2019_21.46.20.ark/srv/daemon-data/da4aaa1b-0ce9-46d2-bd60-5f599cc089ae/ShooterGame/Saved/SavedArks/TheIsland_28.06.2019_15.15.34.ark

我附上了手动工作的完整代码。

#!/bin/bash
export DISPLAY=:0.0

##ARK Map Recovery Script
cd /srv/daemon-data/da4aaa1b-0ce9-46d2-bd60-5f599cc089ae/ShooterGame/Saved/SavedArks

#Check file size of current ark map
file=TheIsland.ark
echo $file
currentsize=$(wc -c <"$file")
echo $currentsize

#Find biggest map file.
actualmap=$(find $PWD -type f -printf '%p\n' -name "*.ark"| sort -nr | head -1)>/srv/daemon-data/da4aaa1b-0ce9-46d2-bd60-5f599cc089ae/ShooterGame/Saved/SavedArks/log.txt
echo $PWD
echo $actualmap
biggestsize=$(wc -c < "$actualmap")
echo $biggestsize

if [ $currentsize -ge $biggestsize ]; then
    echo No map recovery required as over $biggestsize bytes
else
    echo Uh Oh! size is under $biggestsize bytes Attempting map recovery
    echo Checking for Backup dir and creating if necessary
    mkdir -p BackupFiles

    #Move old map into backup dir in the saved location
    echo Moving old Map File to backup dir
    mv $file BackupFiles

    #Stop server using docker commands
    echo Stopping servers

    docker kill da4aaa1b-0ce9-46d2-bd60-5f599cc089ae
    #Copy biggest map file with correct name
    echo Copying backup file
    cp $actualmap $file
fi  

【问题讨论】:

  • 将您的代码复制/粘贴到shellcheck.net,修复所有问题,然后如果您仍然有问题,请创建一个仅演示问题的最小脚本并将其发布以寻求帮助。
  • 仅供参考:用于分隔代码部分的缩进和空行将使您的脚本更易于理解。

标签: bash shell cron


【解决方案1】:

这里不需要在find 命令中使用-printf 选项。 -print 就可以了。

我得到你想要的结果(找到返回找到的文件名,每行一个):

find $PWD -type f -name "*.ark" -print. 

对于-printf%p 无论如何都会为您提供文件名。

来自man find: -print True; 在标准输出上打印完整的文件名,后跟换行符

选项-print 已经做了你想做的事。

【讨论】:

    猜你喜欢
    • 2015-12-21
    • 2014-10-06
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 2019-02-17
    • 2017-06-09
    相关资源
    最近更新 更多