シバン (#!) を使用して正しい Ruby バージョンを使用する方法
概要
Sensu を使用して Sensu クライアントのチェックを実行しています。
Ruby のバージョンが 2.0 未満であるため、次のエラーが発生します。
syntax error, unexpected ',', expecting kEND
RVM を使用して Ruby 2.1.8 をインストールしました。
rvm use 2.1.8
Using /home/jenkins/.rvm/gems/ruby-2.1.8
インタプリタに正しいバージョンを使用させるにはどうすればよいですか?
ファイルの先頭にあるシバン (#!) をさまざまな方法で使用してみました。
他に何か提案はありますか?
編集 @mudasobwaのおかげで、2.1.8のjenkinsユーザーから実行すると機能します
jenkins@chef-production2-backoffice01:~$ rvm use 2.1.8
Using /home/jenkins/.rvm/gems/ruby-2.1.8
jenkins@chef-production2-backoffice01:~$ ruby check_disk_space.rb #works
CheckDisk OK: All disk usage under 85% and inode usage under 85%
jenkins@chef-production2-backoffice01:~$ rvm use 1.8.7
Using /home/jenkins/.rvm/gems/ruby-1.8.7-head
jenkins@chef-production2-backoffice01:~$ ruby check_disk_space.rb #doesn't work even though first row is #!/home/jenkins/.rvm/rubies/ruby-2.1.8/bin/ruby
check_disk_space.rb:32: syntax error, unexpected ':', expecting kEND
short: '-t TYPE[,TYPE]',
^
check_disk_space.rb:32: syntax error, unexpected ',', expecting kEND
もう 1 つの問題は、スクリプトを実行するプログラムが sensu クライアントであり、既知のユーザー sensu で実行されることです。
ps aux |grep sensu センス 13148 4.0 0.4 86512 18696 ? Sl 09:38 0:00 /opt/sensu/embedded/bin/ruby /opt/sensu/bin/sensu-client -b -c /etc/sensu/config.json …
解決策
シバン行フォーマットを誤って使用しています。どの Ruby によって返されたかのように、実行可能ファイルへのパスが存在する必要があります。
したがって、推奨される方法は、この Ruby を標準のデフォルトとして使用することです。
rvm use 2.1.8 --default
選択したバージョンの Ruby を使用して Ruby スクリプトを実行するには、これで十分です。この特定のスクリプトにこのバージョンを選択する場合、最も簡単な方法は、rvm でバージョンを切り替えた後でどの Ruby を実行し、上記の出力をシバン行にコピーして貼り付けることです。
$ which ruby
/home/jenkins/.rvm/rubies/ruby-2.1.8/bin/ruby # NB the output may differ
そして、スペースを入れずにそのままシバンで使用します。
#!/home/jenkins/.rvm/rubies/ruby-2.1.8/bin/ruby