Сценарий Bash не запускается при загрузке

Я написал сценарий bash для запуска тонкого сервера для двух проектов.

#! /bin/sh
cd /path/to/my/project_1
thin -e production -p 3000 --daemonize -s 10 start

Затем поместил его в /etc/init.d/start_thin. Дал 755 разрешений. Ран:

sudo update-rc.d  start_thin defaults.

тогда

sudo reboot

Тонкий не запускается. Спасибо.

ОБНОВИТЬ:

После долгой борьбы я обнаружил эту ошибку, которая возникает только при запуске thin с /etc/init.d/thin:

Запись PID в tmp / pids / thin.3000.pid Использование адаптера rails /path/.rvm/gems/ruby-1.9.2-p290/gems/mysql2-0.3.11/lib/mysql2/mysql2.so: [BUG] Ошибка сегментации ruby ​​1.8.7 (уровень исправлений 302 от 16 августа 2010 г.) [i686-linux]

Думаю, сейчас единственное логичное - перейти на "нормальный" sql gem.

ОБНОВЛЕНИЕ 2:

Я нашел этот ресурс, который помог мне раньше, но не может помочь сейчас.

ОБНОВЛЕНИЕ 3:

Я переустановил RVM с помощью быстрой установки. Теперь, когда запускается скрипт при загрузке, я вижу в журнале, что отсутствует гем: multi_json-1.1.0. Я установил его и вставил в Gemfile. Не помогло. Тем не менее, когда я выполняю сценарий bash вручную - проблем нет. Только при загрузке жалуется на multi_json-1.1.0.

ОБНОВЛЕНИЕ 4:

Только при запуске файл журнала thin содержит:

Я не понимаю, почему он использует 1.8 драгоценных камней, когда у меня установлен Ruby 1.9.2: -?

>> Writing PID to tmp/pids/thin.3000.pid
>> Using rails adapter
>> Exiting!
/usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler/spec_set.rb:87:in `materialize': Could not find multi_json-1.1.0 in any of the sources (Bundler::GemNotFound)
        from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler/spec_set.rb:81:in `map!'
        from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler/spec_set.rb:81:in `materialize'
        from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler/definition.rb:90:in `specs'
        from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler/definition.rb:135:in `specs_for'
        from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler/definition.rb:124:in `requested_specs'
        from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler/environment.rb:23:in `requested_specs'
        from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler/runtime.rb:11:in `setup'
        from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler.rb:107:in `setup'
        from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler/setup.rb:17
        from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require'
        from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
        from /home/user1/myproj1/config/boot.rb:6
        from /home/user1/myproj1/config/application.rb:1:in `require'
        from /home/user1/myproj1/config/application.rb:1
        from /home/user1/myproj1/config/environment.rb:2:in `require'
        from /home/user1/myproj1/config/environment.rb:2
        from /usr/lib/ruby/1.8/rack/adapter/rails.rb:42:in `require'
        from /usr/lib/ruby/1.8/rack/adapter/rails.rb:42:in `load_application'
        from /usr/lib/ruby/1.8/rack/adapter/rails.rb:23:in `initialize'
        from /usr/lib/ruby/1.8/rack/adapter/loader.rb:36:in `new'
        from /usr/lib/ruby/1.8/rack/adapter/loader.rb:36:in `for'
        from /usr/lib/ruby/1.8/thin/controllers/controller.rb:163:in `load_adapter'
        from /usr/lib/ruby/1.8/thin/controllers/controller.rb:67:in `start'
        from /usr/lib/ruby/1.8/thin/runner.rb:174:in `send'
        from /usr/lib/ruby/1.8/thin/runner.rb:174:in `run_command'
        from /usr/lib/ruby/1.8/thin/runner.rb:140:in `run!'
        from /usr/bin/thin:6

Итак, естественно, я установил гем multi_json, затем установил пакет и, что вы думаете? Та же старая проблема :).


person valk    schedule 21.03.2012    source источник
comment
попробуйте ./thin, если он находится в этом каталоге. Скорее всего, дело не в ПУТИ.   -  person glenn jackman    schedule 21.03.2012
comment
спасибо, я попробовал, и еще раз попробовал указать полный путь. не повезло.   -  person valk    schedule 21.03.2012
comment
одна проблема в том, что компакт-диск работает в подоболочке. а вот проблема с запуском тонкой. Я проверил журналы, все в порядке. Так что это должна быть какая-то другая проблема. В настоящее время я начинаю его с тонкого -c / path / to / my / project_1 -e production -p 3000 --daemonize -s 10 start   -  person valk    schedule 21.03.2012
comment
Можете попробовать sudo start start_thin или sudo restart start_thin. Вам не нужно перезагружаться, чтобы протестировать ваш скрипт (это не Windows).   -  person user unknown    schedule 22.03.2012
comment
В показанном вами коде cd выполняется в текущей оболочке, а не в подоболочке.   -  person glenn jackman    schedule 22.03.2012
comment
@userunknown: Windows не требует перезагрузки для запуска и остановки служб.   -  person Marcelo Cantos    schedule 22.03.2012
comment
@userunknown: пробовал, при запуске вручную все работает нормально. Не работает только при перезапуске системы (хотя скрипт запускается!)   -  person valk    schedule 22.03.2012
comment
@glenn jackman: Я не эксперт по оболочке, но другой вопрос по SO лучше проясняет эту проблему: stackoverflow.com/questions/255414/   -  person valk    schedule 22.03.2012
comment
В этом случае, когда вы выполняете свой скрипт, появляется новая оболочка. В этой новой оболочке вы выполняете команду cd, а затем команду thin. Другой вопрос не имеет отношения к делу.   -  person glenn jackman    schedule 22.03.2012
comment
Думал, что решу эту проблему, поместив тонкие .. начальные строки в /etc/rc.local, но даже это не помогает. Очевидно, это как-то связано с тонким запуском при загрузке.   -  person valk    schedule 23.03.2012
comment
@userunknown: спасибо за подсказку. Я только что заметил запуск команды. Но когда я запускаю его, я получаю: start: Unknown job: start_thin. Позже проверю мужчину.   -  person valk    schedule 23.03.2012
comment
Еще одно интересное наблюдение. Когда я запускаю сценарий из командной строки, он иногда выполняется правильно, но в основном просто записывает вывод «тонкой» команды. Тем не мение! Если я запустил его как. start_thin, тогда он всегда выполняется нормально. Но вопрос в том, как мне сказать, чтобы он выполнялся так при запуске ...   -  person valk    schedule 23.03.2012
comment
Я не знаю thin - что это? Бинарный или другой скрипт? Если он работает в текущей оболочке, но не в подоболочке, зависит ли это от установленных переменных? От какой оболочки вы работаете - bash? Большинство людей используют bash, zsh или что-то более удобное, чем sh, так что это может иметь значение. В большинстве случаев делать программу зависимой от каталога, откуда она запускается, - плохая идея, поэтому cd в начале выглядит уже подозрительно. Но в целом я озадачен.   -  person user unknown    schedule 23.03.2012
comment
@userunknown: Thin - это веб-сервер для Rails. ИМХО, действительно хороший. И он должен запускаться из каталога проекта Rails или выполняться с этим каталогом в качестве параметра (thin -c / path / to / my / project_1), который имеет тот же эффект. Но спасибо, я исследую это подробнее, а затем опубликую здесь ответ.   -  person valk    schedule 23.03.2012
comment
Какая у вас установка rvm (однопользовательская, многопользовательская и т. Д.)? Вы пропустили эти части путей rvm в своем вопросе, но выбирается ли правильная среда rvm?   -  person Frederick Cheung    schedule 25.03.2012
comment
@FrederickCheung: это установка для одного пользователя.   -  person valk    schedule 26.03.2012


Ответы (3)


Попробуйте sudo chmod u+x /etc/init.d/start_thin

person Md. Minhazul Haque    schedule 23.03.2012
comment
Ну это уже с 755 разрешениями. И он запускается при загрузке, а также я могу просто запустить его с точкой (.) Start_thin. Я вижу, что он выводит сообщения «Запуск тонкого на порт ...». Но либо что-то убивает его только при загрузке, и я подозреваю, что что-то не так с окружающей средой. - person valk; 24.03.2012

Судя по всему, это тонкое начало довольно запутанно, с интерпретатором ruby ​​1.8.7, но с использованием гемов, скомпилированных для 1.9.2, что звучит как действительно плохая идея. Похоже, что rvm настроен неправильно

Сначала попробуйте загрузить rvm. Если у вас установлен rvm глобально, вы можете сделать это с помощью

source /etc/profile.d/rvm.sh

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

Также rvm требует bash, поэтому убедитесь, что ваш shebang /bin/bash, а не /bin/sh (иногда sh - это просто символическая ссылка на bash, но вам не следует полагаться на это)

person Frederick Cheung    schedule 26.03.2012
comment
Спасибо! Я сделал то, что ты сказал, все равно не работает. Я также читал, что в RVM много ошибок, вероятно, более ранняя версия Ruby должна работать лучше. Думаю с самого начала переустановить. - person valk; 27.03.2012

Я нашел ответ здесь.

Добавил в начало эти строки в мой сценарий bash:

# Load RVM into a shell session *as a function*
if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then

  # First try to load from a user install
  source "$HOME/.rvm/scripts/rvm"

elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then

  # Then try to load from a root install
  source "/usr/local/rvm/scripts/rvm"

else

  printf "ERROR: An RVM installation was not found.\n"

fi

rvm use 1.9.2

Чтобы проверить, что все правильно, внутри bash и сразу под упомянутым кодом я использовал

type rvm | head -1

Если приведенный выше вывод: rvm - это функция, тогда все в порядке.

ПРИМЕЧАНИЕ. То же самое следует сделать и с файлами cron, если по какой-то причине они не работают с RVM.

person valk    schedule 07.04.2012