【问题标题】:Loop over a file and run a shell script循环文件并运行 shell 脚本
【发布时间】:2017-08-25 01:16:32
【问题描述】:

我在 Linux 中有一个 shell 脚本:

#!/bin/bash
#This script is to import tables from mysql to hdfs
source /home/$USER/mysql/source.sh
[ $# -ne 1 ] && { echo "Usage : $0 table ";exit 1; }
table=$1
sqoop import --connect ${domain}:${port}/${database} \
             --username ${username} --password ${password}\
             --query "select * from ${table} where \$CONDITIONS" \
             -m 1 --as-parquetfile --hive-import --hive-database ${hivedatabase} \
             --hive-table ${table} --map-column-java Date=String \
             --target-dir /user/hive/warehouse/${hivedatabase}.db/${table}\
             --outdir /home/$USER/logs/outdir

echo "****************************************************"

此脚本将表名作为参数。表名位于名为 tables.txt 的文件中。

source.sh文件内容:

domain=jdbc:mysql://XXXXXXXXX
port=3306
database=testing
username=xxxxxx
password=xxxxxxx
hivedatabase=testing 

现在我想并行安排这个脚本。我想做的是一次为 10 个表安排这个脚本。就像从 tables.txt 中获取前 10 个表名,然后运行此脚本。如果脚本是针对一个表执行的,那么就取第 11 个表,依此类推......

是否有可能在cron工作中做,或者我们如何才能做到这一点。

请提出最佳方法。

【问题讨论】:

    标签: linux shell scripting cron


    【解决方案1】:

    为了回答这个问题,假设您的脚本位于名为load_data.sh 的文件中,您的设置位于settings.sh 中,并且您的表名列表位于tables.txt 中。现在你可以运行了:

    xargs --max-procs 10 -n 1 sh load_data.sh < tables.txt
    

    详情请阅读xargs 手册页; --max-procs 导致 xargs 一次最多生成 10 个进程,并且它将向每个调用传递一个表名。

    【讨论】:

    • 所以你的意思是说我必须用你的代码创建一个shell脚本。并执行那个shell脚本
    • @Active_user,不一定,xargs 代码也可以从命令行运行。
    • 对。我并不是建议您“创建一个 shell 脚本”。我的意思是,您可以,但我通常会直接在命令行上输入类似这样的内容。
    • @larsks 谢谢它确实有效,但有个小问题我想收集脚本 load_data.sh 的控制台日志,但我可以收集 xargs 的东西
    • 我不完全确定你的意思,这里的 cmets 可能是扩展问答的错误位置。您可以像使用任何命令一样从上述命令 (... &gt; logs.txt) 重定向标准输出。如果您想要更精细的内容,请将逻辑放入您的 load_data.sh 脚本中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多