Специфический для ruby-скрипта gemset Backick

У нас есть установка rails sidekiq для запуска заданий.

Я пытаюсь сделать работу как можно более переносимой, отделив реальный скрипт от вызова sidekiq.

Таким образом, sidekiq вызывает небольшое задание-заглушку, а обратная кавычка вызывает фактический сценарий и фиксирует вывод.

Эта часть работает нормально. Но sidekiq выполняет задание как root, а не как пользователь, в среде которого есть все части rvm, ruby ​​и gemsets. Я хотел бы использовать существующие пользовательские рубины и драгоценные камни rvm.

в вызывающем скрипте (задание sidekiq):

output = `source /path/to/dudes/rvm/environment.file && rvm use  \ 
2.0.0-pxxx@default do ruby /path/to/actual/script.rb`

и вызываемый скрипт запускается, но как root, и он, очевидно, не работает так, как я предполагал, потому что мои требования не найдены.

Если я возьму ту же командную строку и запущу ее от имени локального пользователя из BASH, у которого также нет наборов драгоценных камней, то, похоже, это сработает.

Я пробовал просто обратную галочку, называя это как сценарий оболочки

output = `/path/to/actual/script.rb`

...и в вызываемом скрипте различные комбинации шебангов.

#!/usr/bin/env ruby
#!/usr/bin/env rvm use everything i found on the internets

Теперь я получил скрипты ruby ​​для запуска в средах с заданиями выскочки Linux с помощью оболочек скриптов bash, например: http://techhelplist.com/index.php/tech-tutorials/43-linux-adventures./85-upstart-ruby-job-with-rvm

Но я пытаюсь найти способ сделать это без оберток. Является ли это возможным?


person user145837    schedule 26.09.2013    source источник


Ответы (2)


Нет, это невозможно.

Когда вы используете оператор "backtick" вы, по сути, вызываете Kernel#system(...). Это означает, что выполняемая вами команда запускается в вложенной оболочке, которая не может изменять среду родительского процесса нужным вам образом.

См. этот вопрос для сравнения: Как запустить код после ruby Ядро.exec

Также рекомендуется прочитать больше о модели процесса UNIX.

person maerics    schedule 26.09.2013
comment
Но в этом случае я не пытаюсь изменить окружение дочернего процесса? Я хочу в основном скопировать или имитировать среду от родителя к ребенку. Я, вероятно, не сделал эту часть ясной. Даже если мне нужно заставить дочерний процесс запускать некоторые вещи, чтобы вручную загрузить среду, это нормально. - person user145837; 26.09.2013

Согласно Upstart Intro, Cookbook и Best Practices, пункт 4.2.2 , вы можете установить пользовательские задания в $HOME/.init/.

person mpapis    schedule 26.09.2013