我必须想出一系列值。它们将代表它们代表的服务器和/或虚拟服务器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数组。救命!
答案 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