Получить имя службы в init.d

Я пытаюсь выяснить, как называется сервисный скрипт, который запускается при запуске. Мне нужно имя для последующего вызова сценария по умолчанию.

Я не могу придумать имя заранее, поэтому я должен получить его во время его выполнения.

NAME=${0##*/}
SCRIPTNAME=/etc/init.d/$NAME

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

Я пробовал разные подходы:

  • Используйте $BASH_SOURCE
  • Использовать базовое имя $0
  • Использовать специфичную для bash переменную ${0##*/}

Все они работают, если я запускаю скрипт вручную из оболочки, но не после перезагрузки. Я предполагаю, что init.d запускает процесс по-другому.

Я использую Debian Lenny (знаю, довольно старый...) и bash v3.2.39. Я открыт для использования другого типа оболочки, если это необходимо.

Спасибо.


person RicardoPB    schedule 20.04.2015    source источник
comment
Как каждый из них потерпел неудачу? Я ожидаю, что BASH_SOURCE потерпит неудачу, поскольку сценарий, скорее всего, запускается /bin/sh, и поэтому эта переменная, вероятно, не была установлена. Но я ожидал, что использование $0 сработает (хотя есть префикс S## или K##, с которым вам придется иметь дело).   -  person Etan Reisner    schedule 20.04.2015
comment
Я действительно не понимаю, чего ты хочешь. @EtanReisner, а ты? Не могли бы вы объяснить это мне?   -  person    schedule 20.04.2015
comment
Спасибо!! Я отвечаю в новом ответе, чтобы иметь лучшее форматирование.   -  person RicardoPB    schedule 20.04.2015


Ответы (1)


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

BASH_SOURCE: /etc/rc2.d/S99iap_FA_iapfa

$0: /etc/rc2.d/S99iap_FA_iapfa

${0##*/}: S99iap_FA_iapfa

Vars не пустые, а имя символической ссылки rc. Я написал простой обходной путь и знаю, что он работает независимо от символических ссылок rc или самой службы.

RC_NAME=${0##*/}
NAME="${RC_NAME#[SK][0-9][0-9]}"

SCRIPTNAME=/etc/init.d/$NAME

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
person RicardoPB    schedule 20.04.2015