如何让脚本在特定时间后 运行 后自行终止?

How to make a script kill itself after running after a specific time?

我有这个脚本:

#!/bin/sh

echo "Start: " $(date +%s)
(time hive --hiveconf mapreduce.job.reduce.slowstart.completedmaps=0.5 --hiveconf mapred.reduce.tasks=10 --hiveconf mapreduce.reduce.shuffle.parallelcopies=15 --hiveconf hive.execution.engine=mr -f sample-queries-tpcds/query50.sql --database tpcds_text_db_1_10) 2> output/tpcds_query_2c_50_mr.out
echo "End: " $(date +%s)

我如何在其中添加一些代码,以便它在执行 5 秒后自行终止? (比如 ./script.sh 5 秒后)?

只是运行 hive在后台,然后进入睡眠5秒,当sleep退出时杀死hive。如果 hive 已经完成,kill 将打印一条错误消息,但您可以将其重定向到 /dev/null 以忽略它。

hive --hiveconf mapreduce.job.reduce.slowstart.completedmaps=0.5 \
     --hiveconf mapred.reduce.tasks=10 \
     --hiveconf mapreduce.reduce.shuffle.parallelcopies=15 \
     --hiveconf hive.execution.engine=mr \
     -f sample-queries-tpcds/query50.sql \
     --database tpcds_text_db_1_10) \
     2> output/tpcds_query_2c_50_mr.out & hive_pid=$!

sleep 5 & wait
kill $hive_pid 2> /dev/null

此脚本将在 5 秒后自行终止:

#!/bin/sh
echo "Start: " $(date +%s)
sleep 5s && kill $$ &
while sleep 1; do echo Working; done
echo "End: " $(date +%s)

管道 sleep 5s && kill $$ 在后台 运行 并在 5 秒后发出终止。

您的命令,可能在前台 hive、运行。在上面的例子中,我使用了一个 while 循环,因为它可以很容易地证明这个概念是有效的。替换为您的配置单元命令会导致:

#!/bin/sh
echo "Start: " $(date +%s)
sleep 5s && kill $$ &
(time hive --hiveconf mapreduce.job.reduce.slowstart.completedmaps=0.5 --hiveconf mapred.reduce.tasks=10 --hiveconf mapreduce.reduce.shuffle.parallelcopies=15 --hiveconf hive.execution.engine=mr -f sample-queries-tpcds/query50.sql --database tpcds_text_db_1_10) 2> output/tpcds_query_2c_50_mr.out
echo "End: " $(date +%s)