bash为启动进程创建id数组

时间:2016-05-06 23:11:36

标签: bash

我必须想出一系列值。它们将代表它们代表的服务器和/或虚拟服务器ID。所以我必须在25台服务器上运行100个应用程序实例。 server 1 runs process 1,26,51,76 server 2 runs process 2,27,52,77 ... server 25 runs process 25,50,75,100

我需要一种方法来执行这样的脚本

# hostname is in a format like production-01.localdomain
host_id=`hostname | tr 'A-Za-z-.' ' ' | tr -d '[[:space:]]'`

# need to create array of server ids in server_ids

for server_id in server_ids
do
    /usr/local/bin/virtual_process $server_id
done

但我不知道如何创建server_ids数组。救命!

3 个答案:

答案 0 :(得分:1)

这里你去。这可以通过创建一个空格分隔的字符串而不是一个过度

的数组来解决您的问题
# hostname is in a format like production-01.localdomain
server_id=`hostname | tr 'A-Za-z-.' ' ' | tr -d '[[:space:]]' | awk '{print NR}'`

# need to create array of server ids in server_ids
server_ids="$server_id $(( $server_id+25 )) $(( $server_id+50 )) $(( $server_id+75 ))"

for server_id in $server_ids
do
    /usr/local/bin/virtual_process $server_id
done

答案 1 :(得分:1)

这是一个惯用的Bash解决方案应该按原样运行:

#!/usr/bin/env bash

# Extract the base server ID by extracting the number from the hostname,
# eliminating any leading zeros.
# E.g., 'production-01.localdomain' -> '1'
baseServerId=$(( 10#$(tr -dC '[0-9]' <<<"$HOSTNAME") ))

# Loop 4 times, starting with the base server ID and
# adding 25 in each subsequent iteration.
for (( i = 0; i < 4; ++i )); do
  /usr/local/bin/virtual_process "$(( baseServerId + i * 25 ))"
done

如您所见,

  • 使用tr进行补充的单个-C命令仅足以提取数字:-dC '[0-9]'表示:删除({{1} })所有-d)个数字(-C)。

    • 由于结果数字可以有前导零,因此必须删除这些数字以避免误解为八进制数字。使用[0-9]评估算术扩展tr内的$(( ... ))命令 - 所需的数字基数 - 前置于10#的输出,就是这样。
  • 当算术C风格的循环执行时,不需要服务器ID的数组

也就是说,由于偏移列表很小并且具有固定的增量,因此更简洁的解决方案是:

tr

使用brace expansion的更多算法方法(应注意,它只支持 literal 参数;由于使用第3个参数指定步骤,因此需要使用Bash v4 + 值):

for offset in 0 25 50 75; do
  /usr/local/bin/virtual_process "$(( baseServerId + offset ))"
done

答案 2 :(得分:0)

如果您只需要1到25之间的数字序列,则可以使用bash&#39; brace expansion

for server_id in {1..25}
do
    /usr/loca/bin/virtual_process $server_id
done