-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparallelhost.pl
More file actions
executable file
·62 lines (52 loc) · 1.7 KB
/
Copy pathparallelhost.pl
File metadata and controls
executable file
·62 lines (52 loc) · 1.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/perl
# ファイルまたは標準入力からコマンドリストを読み込み複数ノードで並列実行する
#
# Usage: ./parallelhost.pl commandlist.txt
#
# @host_list は計算ノードのリスト
# コマンドリストは1行に1コマンドを記載
#
# 2015-01-14 Yuki Naito (@meso_cacase)
use warnings ;
use strict ;
$| = 1 ;
# 計算ノード一覧
my @host_list = ('s01','s02','s03','s04','s05','s06','s07','s08') ;
# コマンドリストを読み込む
my @command_list = <> ;
parallel(\@command_list, \@host_list) ;
exit ;
# ====================
sub parallel { # コマンドリストを読み込み並列実行する
my @command_list = @{$_[0]} ; # コマンドリストをリファレンスで受け取る
my @host_list = @{$_[1]} ; # 計算ノードリストをリファレンスで受け取る
my %host ;
foreach (@command_list){
chomp ;
my $host = shift @host_list ; # @host_list が空きノード一覧となる
if (my $pid = fork){
# 親プロセス
my $timestamp = timestamp() ;
print "[$timestamp] $pid ssh $host \'$_\'\n" ;
$host{$pid} = $host ;
} else {
# 子プロセス
system("ssh $host \'$_\'") ;
exit ;
}
# 並列実行するコマンドの最大数に達したらwaitする
unless (@host_list){
my $pid = wait ;
push @host_list, $host{$pid} ;
}
}
# 子プロセスが無くなる、つまりwaitが-1を返すまでwaitする
while (wait != -1){ }
} ;
# ====================
sub timestamp { # タイムスタンプを 2000-01-01 00:00:00 の形式で出力
my ($sec, $min, $hour, $mday, $mon, $year) = localtime ;
return sprintf("%04d-%02d-%02d %02d:%02d:%02d",
$year+1900, $mon+1, $mday, $hour, $min, $sec) ;
} ;
# ====================