Почему скрипт выключения НЕ запускается?

1824
marekful

Я установил скрипт выключения в системе Ubuntu, который не выполняется. Это экземпляр Amazon EC2. Я не уверен, что это связано с этим фактом, просто хотел указать на это.

Сценарий должен передать некоторые файлы журнала в корзину Amazon S3, поэтому он должен выполняться при работающей сети.

Вот как я установил скрипт:

1) Создайте файл /etc/init.d/push-apache-logs-to-s3.shс необходимыми командами.

2) Сделано это исполняемым с sudo chmod +x push-apache-logs-to-s3.sh

3) Выполнено sudo update-rc.d push-apache-logs-to-s3.sh start 0 0 .

Выход из вышесказанного составил:

update-rc.d: warning: /etc/init.d/push-apache-logs-to-s3.sh missing LSB information update-rc.d: see <http://wiki.debian.org/LSBInitScripts> Adding system startup for /etc/init.d/push-apache-logs-to-s3.sh ... /etc/rc0.d/S00push-apache-logs-to-s3.sh -> ../init.d/push-apache-logs-to-s3.sh 

Содержание /etc/rc0.d/сейчас:

lrwxrwxrwx 1 root root 17 Jul 31 2012 K09apache2 -> ../init.d/apache2 lrwxrwxrwx 1 root root 29 Jun 16 2012 K10unattended-upgrades -> ../init.d/unattended-upgrades lrwxrwxrwx 1 root root 26 Jun 16 2012 K15landscape-client -> ../init.d/landscape-client lrwxrwxrwx 1 root root 19 Apr 10 11:11 K20memcached -> ../init.d/memcached -rw-r--r-- 1 root root 353 Jul 26 2012 README lrwxrwxrwx 1 root root 35 Jul 10 12:01 S00push-apache-logs-to-s3.sh -> ../init.d/push-apache-logs-to-s3.sh lrwxrwxrwx 1 root root 18 Jun 16 2012 S20sendsigs -> ../init.d/sendsigs lrwxrwxrwx 1 root root 17 Jun 16 2012 S30urandom -> ../init.d/urandom lrwxrwxrwx 1 root root 22 Jun 16 2012 S31umountnfs.sh -> ../init.d/umountnfs.sh lrwxrwxrwx 1 root root 20 Jun 16 2012 S35networking -> ../init.d/networking lrwxrwxrwx 1 root root 18 Jun 16 2012 S40umountfs -> ../init.d/umountfs lrwxrwxrwx 1 root root 20 Jun 16 2012 S60umountroot -> ../init.d/umountroot lrwxrwxrwx 1 root root 14 Jun 16 2012 S90halt -> ../init.d/halt 

Когда я вручную выполняю скрипт sudo ./push-apache-logs-to-s3.sh, он выполняет намеченную работу.

Эти сценарии выполняются root? Что мне не хватает?

2
Проблемы такого рода обычно возникают из-за того, что что-то отсутствует в переменных окружения при неинтерактивном запуске. Я предполагаю, что вы приняли меры предосторожности, чтобы не использовать относительные пути в ваших скриптах, так что, возможно, зависимость от переменной среды, которая недоступна. Не могли бы вы добавить сценарий к вашему вопросу? GnP 11 лет назад 1
@gnp Я отправил еще один вопрос об этом с более подробной информацией и содержанием скрипта. Пожалуйста, проверьте это здесь: http://superuser.com/questions/617957/lsb-init-script-not-executed marekful 11 лет назад 0
Я думаю, что теперь, что не так. `s3cmd` был настроен под другим пользователем, а не` root`, поэтому сценарий инициализации, запускаемый root'ом, не может выполнить команду `s3cmd`. Я попробую настроить его под пользователем root и посмотреть, поможет ли это. marekful 11 лет назад 0
Нет, это не помогло. Когда я выполняю скрипт с любым пользователем, он делает то, что должен, поэтому `s3cmd` МОЖЕТ получить доступ к его конфигурации. Тем не менее, по-видимому, сценарий инициализации не выполняется при выключении ... marekful 11 лет назад 0

3 ответа на вопрос

1
terdon

Каково ожидаемое поведение при настройке сценария для запуска S00? В S00моей системе нет сценариев, может быть, требуется минимум 1? Вы также явно не устанавливали start / stop, возможно, это вызывает проблемы. На всякий случай попробуйте

sudo update-rc.d push-apache-logs-to-s3.sh start 01 2 3 4 5 . stop 01 0 1 6 . 

Если это по-прежнему не работает, пожалуйста, обновите ваш вопрос, указав, кто ваш скрипт (или хотя бы его заголовки), возможно, что-то там не так.


РЕДАКТИРОВАТЬ

Увидев сценарий, который вы разместили в своем другом вопросе, я вижу две возможные проблемы. Во-первых, !# /bin/shвместо строки у вас есть пробел #!/bin/sh.

Что более важно, почему вы используете shвместо bash? shне поддерживает source, не говоря уже .о псевдониме для источника. bashВместо этого измените ваш скрипт, чтобы исправить это. На самом деле я не понимаю, почему это работает, когда вы запускаете его вручную, .должно выдать ошибку:

$ sh $ source foo sh: 1: source: not found $ bash $ source foo bash: foo: No such file or directory 

Поцарапайте это, я был неправ, поскольку @gnp указал, dashдействительно поддерживает ..

Я попробовал ваше предложение, но все еще не повезло. Кроме того, теперь я изменил скрипт в /etc/init.d/, чтобы он был правильным LSB-скриптом, как и все остальные. Все еще не звонят ... marekful 11 лет назад 0
@ MarcellFülöp и `/ etc / init.d / push-apache-logs-to-s3.sh` принадлежат пользователю root? terdon 11 лет назад 0
Да, это `-rwxr-xr-x 1 корневой корень` marekful 11 лет назад 0
В большинстве систем Ubuntu sh является символической ссылкой на bash или dash `lrwxrwxrwx 1 root root 4 марта 29 2012 / bin / sh -> dash`. Также большинство сценариев, которые у меня есть на /etc/init.d, имеют пробел после шебанга и используют sh в качестве оболочки. GnP 11 лет назад 0
Re: РЕДАКТИРОВАТЬ. Хорошие моменты. В первой версии у меня был `#! / Bin / bash`. Затем я скопировал один из существующих сценариев инициализации и изменил его так, чтобы `#! / bin / sh` пришел оттуда, так что я думаю, что все в порядке. Постараюсь изменить его обратно на `#! / Bin / bash`. marekful 11 лет назад 0
@gnp да, но `dash` не поддерживает` source` или `.`, поэтому проблема остается, так как OP получает файлы. Пространство действительно кажется неактуальным. terdon 11 лет назад 0
@ MarcellFülöp, потому что `.` не работает с` sh` или `dash`. terdon 11 лет назад 0
@terdon dash поддерживает `.`:` ~ / workspace $ dash $ echo $ a $. / home / gabriel / workspace / testfile $ echo $ a 2 $ ` GnP 11 лет назад 0
@gnp Я исправлен, так что я ошибаюсь в сообщении об ошибке. terdon 11 лет назад 0
1
GnP

Вы хотите, чтобы скрипт работал при выключении. Заменить старт с остановом следующим образом:

sudo update-rc.d push-apache-logs-to-s3.sh stop 0 0 . 

Обратите внимание, что он получит предваренный K вместо S

Я пробовал это раньше, но до сих пор нет признаков того, что это будет выполнено. marekful 11 лет назад 0
Это не то, что делают `stop` и` start`, они не имеют ничего общего с выключением, это определяется данными уровнями запуска. Смотрите `man update-rc.d`. terdon 11 лет назад 0
Вы правы, он будет работать при переключении на уровень выполнения 0, остановка и запуск изменят только переданный ему параметр, который в случае OP не имеет никакого значения. GnP 11 лет назад 0
`Stop` и` start` предназначены для указания уровня запуска и остановки. `stop 0 1 6` означает остановку, например, на уровнях выполнения 0,1 и 6. terdon 11 лет назад 0
0
marekful

Корень проблемы в том, что s3cmdне может прочитать его файл конфигурации. По какой-то неизвестной мне причине, во время изменения уровня запуска (0), когда initвыполняются init-скрипты, очевидно, что rootпользователь, который запускает эти скрипты, не считается «настоящим» пользователем, поэтому у него нет «домашнего» каталога, откуда s3cmdпытается прочитать конфиг.

Явное указание местоположения файла конфигурации с помощью --config=...решает эту проблему.

Спасибо за помощь и вклад от всех!

Похожие вопросы