使用at命令安排脚本

时间:2019-12-27 16:28:45

标签: linux bash shell at-utility

我已经编写了一个脚本,并且希望使用at命令安排它在特定时间运行。我还想使用一个参数,以便在脚本中传递我想要的时间,以便可以在特定时间执行它。

该脚本的名称为displaydir,它具有以下参数和格式:

./displaydir dir1 09:00 AM

脚本:

#!/bin/bash
at $2 $3
ll $1
cp ./$1/ ./dir2
exit 0

2 个答案:

答案 0 :(得分:1)

要每周运行一次,您应该像这样重写脚本:

#!/bin/bash
ll $1
cp ./$1/ ./dir2
exit 0

at命令的位置不存在。

您需要使用命令croncrontab -e中添加记录

0 18 * * 1 /path/to/displaydir argument

不确定使用at运行命令时是否可以添加参数

此脚本的输出应重定向到某处,因为atcron在后​​台运行并且不在终端/屏幕上打印信息

at命令的格式为:

at -f /path/to/displaydir 6:00PM

这将在18:00h运行脚本/path/to/displaydir

答案 1 :(得分:0)

这里有几个问题。引起直接问题的一个原因是at从其标准输入读取要运行的命令,而不是(通常)脚本。通常,将输入提供给脚本中的命令(作为其标准输入)的最简单方法是here-document,如下所示:

command <<EOF-MARKER
input
more input
EOF-MARKER
nextCommand

下一个问题是,要求cp命令复制目录,但尚未传递-R选项,因此它将拒绝执行任何操作。我认为您可能希望cp ./$1/* ./dir2复制目录中的文件,而不是目录本身。

我不确定,但是如果ll是别名,则它可能无法在at作业中工作(因为别名通常在非交互式shell中被禁用)。我建议使用完整的命令(可能是ls -l)。

接下来,作业的输出将通过电子邮件发送给您。或者至少,它将尝试通过电子邮件将其发送给您。它可能没有做任何有用的事情。如果您希望输出到可预测的位置,则应自己重定向。

最后,如果目录名$1中包含任何有趣的字符,使用不带引号的目录将引起麻烦。 (我主要在macOS上工作,其中带空格的文件名非常普遍,因此我知道这个问题。)通常,处理此问题的最佳方法是将参数引用双引号,但在此处-文档单引号更可能起作用(除非名称本身可能包含单引号)。

因此,这是我获得的更正脚本的内容:

#!/bin/bash
at $2 $3 <<EOF
ls -l '$1'
cp ./'$1'/* ./dir2
exit 0
EOF