如何在预定时间运行带参数的 bash 命令

如何在预定时间运行带参数的 bash 命令

我有一个 bash 文件,它每天对一系列新下载的文件运行一个进程,所有处理的总运行时间为几个小时。

我想在某个特定文件上运行某个进程 24 小时后运行某个特定的 bash 命令。

我曾尝试过使用at它,但是我认为你不能使用 at 来运行 bash 命令,即:

at now +24 hours gsutil rm gs://$google_cloud_storage_location/$processed_file

而且我也无法让它运行带有参数的 bash 脚本。

at now +24 hours -f example_script.bash $google_cloud_storage_location/$processed_file

安排这些任务的正确方法是什么?我是否只需要一个完全不同的工具,还是我错过了一种方法at

示例 Bash 脚本:

for file in list_of_files; do
    #do some processing
    ....
    #then delete the file
    at now +24 hours gsutil rm gs://file
done

答案1

如果您希望在设置作业时替换变量,则可以通过at简单地将命令at通过 echo 管道传输到管道来完成运行简单的 bash 命令。对于您的第一个示例,语法将是

echo "gsutil rm gs://$google_cloud_storage_location/$processed_file" | at now +24 hours

对于第二个示例,语法可以是

echo "/path/to/example_script.bash $google_cloud_storage_location/$processed_file" | at now +24 hours

如果需要在作业时执行变量替换,则有点棘手。您需要创建一个在作业完成时运行的脚本,在适当的时间进行替换。这可以通过执行以下专门的命令(例如来自脚本)来完成

echo -e '#!/bin/bash' > /path/to/script

然后

echo '<your command here>' >> /path/to/script

该命令的语法at

at now +24 hours -f /path/to/script

当然,该+24 hours部分应该调整到适当的长度。

答案2

由于at从标准输入或文件读取命令:

for file in list_of_files; do
    #do some processing
    ....
    #then delete the file
    at now +24 hours <<EOF
gsutil rm gs://"$file"
EOF
done

使用 heredoc 来提供命令是可行的,因为除非 heredoc 标记(EOF,此处)被引用,否则变量会在 heredoc 中扩展。

相关内容