Назад | Перейти на главную страницу

Сценарий init.d не запускается при запуске

У меня есть то, что я считаю довольно простым скриптом, который я хочу запустить при запуске, но я новичок в init.d сценарии, и, возможно, есть лучший способ сделать это вообще.

В основном я хочу, чтобы мой скрипт запускался при запуске системы, поэтому у меня есть скрипт ruby, который я переместил в /usr/bin, и назван просто consumer

Для краткости скажем, что это выглядело так, но на самом деле что-то произошло:

#!/usr/bin/env ruby

# just example code
puts "do stuff"

Тогда у меня есть init.d сценарий помещен в /etc/init.d и назвал просто consumer.

#!/bin/bash
### BEGIN INIT INFO
# Provides:          consumer
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INF

# /etc/init.d/consumer
#

# Some things that run always
touch /var/lock/consumer

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting Consumer"
    consumer &
    echo "Consumer started successfully."
    ;;
  stop)
    echo "Stopping Consumer"
    echo "Nothing happened..."
    ;;
  *)
    echo "Usage: /etc/init.d/consumer {start|stop}"
    exit 1
    ;;
esac

exit 0

Теперь, если я сохраню этот файл и просто запущу sudo /etc/init.d/consumer start, работает отлично! Он запускается и дает мне желаемый результат. Итак, я бегу:

$ sudo update-rc.d consumer defaults
Adding system startup for /etc/init.d/consumer ...
  /etc/rc0.d/K20consumer -> ../init.d/consumer
  /etc/rc1.d/K20consumer -> ../init.d/consumer
  /etc/rc6.d/K20consumer -> ../init.d/consumer
  /etc/rc2.d/S20consumer -> ../init.d/consumer
  /etc/rc3.d/S20consumer -> ../init.d/consumer
  /etc/rc4.d/S20consumer -> ../init.d/consumer
  /etc/rc5.d/S20consumer -> ../init.d/consumer

Но при перезагрузке системы мой скрипт не запускается, есть идеи? Я не уверен, что делать дальше. Я настроил все разрешения для скриптов на 775, и убедился root владели ими все тоже.

Любая помощь будет очень полезна.

Попробуйте указать полный путь к consumer. Я подозреваю, что в этот момент его нет в пути по умолчанию, поэтому он не может его выполнить.

Выполнение «потребитель &» просто заставит задачу продолжить и продолжить. Если оболочка-владелец завершает работу, она завершает все фоновые задачи. Вы говорите, что сценарий работает в командной строке, но ваш демон не выживет, если вы выйдете из системы?

Вы хотите запустить свой демон с помощью чего-то вроде start-stop-daemon.

РЕДАКТИРОВАТЬ: на самом деле, прочитав ваш текст еще раз, я не уверен, что потребитель вообще демон? Если вы просто хотите запустить какой-то код при запуске (например, очистку дома), вы пишете строку в /etc/rc.local.

Если выполнение сценария занимает много времени, вы можете отказаться от него. То есть:

consumer &
disown %1

Теперь сценарий переживет завершение работы оболочки. Обратите внимание, что если оболочка выводит текст, она сохранит тот же tty, что может вызвать проблемы, в зависимости от того, что с ней произойдет после завершения ее оболочки.

Если вы используете Ubuntu, попробуйте использовать это:

http://manpages.ubuntu.com/manpages/hardy/man8/update-rc.d.8.html

просто используйте:

sudo systemctl включить consumer.service

включить

sudo systemctl отключить consumer.service

отключить

если ваш скрипт совместим с LSB, все будет работать нормально.