Techioz Blog

シバン (#!) を使用して正しい 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