Es kommt vor, dass man eine ganz bestimmte Version einer interpretierten Programmiersprache (oder eine Laufzeitumgebung o. ä.) braucht, oder auch mal mehrere Versionen parallel für unterschiedliche Projekte. Dann können Version Manager hilfreich sein. Mit solchen Tools kann man unterschiedliche Versionen einer Programmiersprache installieren und verwalten. Zu den bekannteren Exemplaren gehören rbenv oder RVM für Ruby, nvm für Node.js, pyenv für Python und diverse andere. Typischerweise wird ein Version Manager in den Konfigurationsdateien der Shell (etwa ‘‘.bashrc’’) eingebunden.
Aber was, wenn diese Einbindung nicht stattfindet? Cronjobs etwa werden in einer reduzierten Umgebung ausgeführt, in denen die Konfigurationsdateien der Shell typischerweise nicht ausgewertet werden. Bei einigen Linux-Distributionen, beispielsweise bei Ubuntu, ist die ‘‘.bashrc’’ sogar so angelegt, dass sie bei nicht-interaktiven Sitzung fast zu Beginn abbricht. rbenv & Co. stehen also für Cronjobs nicht ohne weiteres zur Verfügung.
Wenn man jetzt allerdings ein in Ruby geschriebenes Skript in einem Cronjob ausführen will und die gewünschte Ruby-Version mittels rbenv installiert ist, muss man die Einbindung im Cronjob “nachbauen”. In die .bashrc
wird rbenv typischerweise etwa so eingebunden
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
Grob gesagt, binde rbenv in den Suchpfad ein und führe eine Initialisierungfunktion aus. Und genau das kann man in einem Cronjob erledigen, etwa
0 0 * * * /bin/bash -c 'export PATH="$HOME/.rbenv/bin:$PATH"; eval "$(rbenv init -)"; ruby /path/to/file.rb'
Dabei muss man beachten, dass man das Skript über den Interpreter aufrufen muss, also ruby /path/to/file.rb
, auch wenn das Skript einen Shebang wie #!/usr/bin/env ruby
verwendet.
Für andere Sprachen, Laufzeitumgebungen und Version Manager kann man nach dem gleichen Grundprinzip verfahren.