我有一个 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 中扩展。