2012-09-28 雨 [長年日記]
_1 bashの自前関数とtaskset
全CPUで処理が動くよう,tasksetでどのCPUで動かすか指定するためにこんなbashスクリプトを書いた.
#!/bin/bash function hoge() { echo "Hi there!" } export -f hoge maxcpus=$(cat /proc/cpuinfo | grep -c processor) maxcpu=$((maxcpus - 1)) for cpu in $(seq 0 $maxcpu) do taskset -c $cpu hoge & done
でも実行すると以下の様なエラーを吐いてうまく動かない.
execvp: No such file or directory failed to execute hoge execvp: No such file or directory failed to execute hoge ...
どうも自前で作った関数はダメらしい.ソース見てないけどエラーメッセージを見るにexecしているからこれまでのシェルスクリプトの中身はご破算になっててそういうコマンドがあるんだと思って呼びに行くも見つからんと怒られている感じ.なので
#!/bin/bash function hoge() { cpu=$1 taskset -c $cpu echo "Hi there!" } export -f hoge maxcpus=$(cat /proc/cpuinfo | grep -c processor) maxcpu=$((maxcpus - 1)) for cpu in $(seq 0 $maxcpu) do hoge $cpu & done
のように呼ばれた関数内でtasksetを呼ぶように変更.当然関数にしている部分を別のファイルに切り出せば元のような作りでもいいんだが,ファイルの受け渡しが面倒なので一つにまとめるということが重要なのでこうした.