У меня есть то, что я считаю довольно простым скриптом, который я хочу запустить при запуске, но я новичок в 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, все будет работать нормально.