Как удалить файл из команды в файле оболочки для /etc/init.d?

877
CaesarS

У меня есть вопрос о работе с /etc/init.dсценарием оболочки.

Все, что я хочу сделать, это удалить файл из команды внутри сценария оболочки следующим образом:

case $1 in  stop) echo "Stopping" rm -f /var/run/memcached/memcached.pid  esac 

Я сохраняю это как тест и создаю memcached.pidфайл.

Когда я запускаю /etc/init.d/testстоп со скриптом из /etc/init.d/папки, memcached.pidфайл не удаляется.

Когда я запускаю скрипт из моего домашнего каталога, он работает нормально.

Существует ли специальный формат или структура команды, которая необходима?

2
Такая команда `rm -f` должна просто работать. Особенно в случае PID-файла, который в любом случае обычно удаляют сценарии `init.d`. Но так как вы показываете только небольшую часть вашего скрипта, трудно сказать, нет ли чего-то еще, что заставляет команду задыхаться. Одна идея заключается в том, что вы запускаете команду как `root` или через` sudo`? Кроме того, я бы порекомендовал проверить [этот хороший базовый пример `init.d`] (http://werxltd.com/wp/2012/01/05/simple-init-d-script-template/) и посмотреть, если это помогает вам. JakeGould 7 лет назад 0
Я запускаю команду как sudo так: sudo /etc/init.d/test stop. Спасибо за ссылку на примеры! CaesarS 7 лет назад 0

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

2
Argonauts

Используйте полный путь к rm; подтвердите, что то же самое в вашей системе:

 /usr/bin/rm -f /var/run/memcached/memcached.pid 

В сценариях инициализации обычно не указана переменная окружения PATH (или корни).

Я изменил мини-скрипт, как у вас, и он до сих пор не удаляет файл pid. Это действительно странно. До этого ничего нет, этот фрагмент - тестовый скрипт. CaesarS 7 лет назад 0
Вы подтвердили путь к rm? Используйте команду, которая rm, чтобы получить свой путь Argonauts 7 лет назад 0
Если у вас правильный путь, добавьте следующую команду перед rm; сначала подтвердите путь к этой программе. / usr / bin / chmod u + w /var/run/memcached/memcached.pid для отладки дальнейшего перенаправления вывода каждой команды путем добавления следующей строки в конце каждой: >> /var/logs/initlog.log 2 > & 1 Argonauts 7 лет назад 0
Затем, очевидно, просмотрите этот файл после его запуска Argonauts 7 лет назад 0
Да, я подтвердил правильный путь со всеми жестко закодированными путями. Теперь попробуйте журнал отладки. CaesarS 7 лет назад 0
Журнал отладки не привел к файлу. CaesarS 7 лет назад 0
Мне удалось заставить его работать так, но я не уверен, что отличается от моего маленького тестового сценария, с которого я начал :-) PIDFILE = "/ var / run / memcached / memcached.pid" printf "% s \ n" $ PIDFILE case $ 1 в остановке) echo "Остановка" rm -f $ PIDFILE esac printf "% s \ n" $ PIDFILE CaesarS 7 лет назад 0
Я выделил эту особенность в строку с #. / lib / lsb / init-functions в самом начале скрипта и закомментировали его. Сценарий ведет себя как обычный скрипт bash. Я уверен, что это делает что-то важное. Я исследую это позже. CaesarS 7 лет назад 0
. / lib / lsb / init-functions пытался найти общую «библиотеку», которую необходимо было использовать в скриптах init.d - очень вероятно, что у вас не установлено (или, по крайней мере, в этом месте) и эта строка вызвал ошибку. Обычно ошибка не приводит к сбою следующих строк в обычном скрипте bash, если в скрипте не было `set -e` или` #! / Bin / bash -e` (или, возможно, в скрипте инициализации более высокого уровня, который называет это); этот флаг заставит скрипт завершить выполнение при первом появлении ошибки. И это объясняет, почему не было создано ни одного лог-файла - оно никогда не заходило так далеко. Argonauts 7 лет назад 0

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