6

У меня есть несколько сайтов RoR, запущенных на моем веб-сервере, и мне нужно запустить скрипт ruby при запуске.

Итак, я поместил bash-скрипт в /etc/init.d, который вызывает процесс ruby. К сожалению, этому процессу ruby нужны некоторые вещи, которые еще не загружены.

Я попытался добавить sleep 300 в начале моего скрипта bash, но это не очень помогает, потому что это также влияет на запуск таких вещей, как ssh, apache и т.д.

Кроме того, я не хочу загружать все библиотеки ruby при запуске, потому что это замедлит время загрузки.

4 ответа4

9

sleep 300 - это путь, но вам нужно поместить его в функцию, которую вы назовете асинхронной:

myscript()
{
    sleep 300

    # do what you want
}

myscript &

# continue with other things
6

Спать в течение пяти минут довольно нестабильно. Что, если что-то позднее в цепочке загрузки займет необычно много времени для запуска? И почему вы хотите, чтобы ваша система загружалась дольше, чем необходимо?

Правильный способ сделать это - запустить скрипт запуска после того, от чего он зависит. Как вы это делаете, зависит от дистрибутива.

В Debian вы указываете в заголовке скрипта, какие зависимости ваш скрипт имеет: Вот пример из /etc/init.d/README в Debian Wheezy:

# Required-Start:    $remote_fs $syslog

В других системах вы обычно называете скрипт с номером где-то в имени файла в одной из папок /etc/rc?.d/ . На таких дистрибутивах просто дайте ему большее число, чем то, от чего зависит.

0

Интересно, вы могли бы запустить другой поток, и первое, что делает поток, это сон 300. Затем он вызвал бы скрипт, который вы бы вызвали из init.d

Я думаю, что это будет что-то вроде

newscript &
0

создать файл: delay

#!/bin/bash
# $1:delay time(s)
# $2:command
# example:
#    delay 10 "conky -d"

sleep $1
exec $2

затем

chmod a+x delay
delay 10 "xxx"

положить его в /etc/rc.local

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .