Добавить элемент в inittab в OpenSuse 12.1

Добавить элемент в inittab в OpenSuse 12.1

В настоящее время я работаю над проектом, в который необходимо добавить функцию, inittabпозволяющую программе загружаться при запуске системы.

Программа, которую я пытаюсь запустить, — это приложение ac# mono. Я создал стартовый скрипт, и если его запустить вручную, программа запускается нормально. Однако, когда я вставляю его в inittabпрограмму, он не запускается.

Я проверил, /var/log/messagesно ничего не сообщается, просто идет перезагрузка.

Ниже приведено то, что я добавил в свой inittabсценарий.

bes:2345:respawn:/home/bits/MyProgram/start.myprogram

Спасибо за любую помощь, которую вы можете оказать.

ОБНОВЛЯТЬ Ниже приведен код стартового скрипта, который находится в /home/bits/MyProgram.

#!/bin/sh

cd /home/bits/MyProgram

/usr/bin/mono EmailServer.exe "$@"

Я также пробовал добавлять > mylog.txt в конец строки, начинающейся с /usr/bin/mono, например

/usr/bin/mono EmailServer.exe "$@" > mylog.txt

Если я запускаю стартовый скрипт вручную, то даже если я не нахожусь в каталоге, где находится стартовый скрипт, он работает нормально, просто когда я добавляю его в inittab и запускаю telinit q, он никогда не запускается и журнал не записывается, хотя журнал записывается, если я запускаю программу вручную.

Спасибо за любую помощь, которую вы можете оказать.

решение1

Разместите где-нибудь свою программу.

Скопируйте и отредактируйте файл шаблона скелета для управления заданиями init, который находится по адресу/etc/init.d/скелетон.

Измените этот файл, чтобы указать, КАКОЙ уровень запуска вам нужен... в вашем примере вам нужны 2,3,4,5, в верхней части файла (в комментариях) есть параметры для указания желаемых уровней запуска.

Поместите этот новый файл в/etc/init.dс описательным названием. (моеизобретенноеимяиспользовано в примере)

Независимый от платформы метод проверки или включения/отключения (если вы использовалискелетфайл)

sudo /etc/init.d/myfancyname start
sudo /etc/init.d/myfancyname stop
sudo /etc/init.d/myfancyname restart

Существуют специфические для дистрибутивов методы для выполнения тех же действий, например, Debian используетupdate-rc.d myfancyname [запуск|остановка|включение|отключение...]

Изменение inittab — этов целомаплохойИдея в том, что если вы что-то испортите, система больше не загрузится, и тогда у вас будет ДВЕ проблемы. (регулярное выражение не нужно!)

Добавление скриптов в подкаталог /etc/init.d/ более стандартизировано и может использоваться практически с ЛЮБОЙ версией Linux, возможно, с некоторыми *nix, может быть, с некоторыми bsd.

решение2

Проблема проста: вы используете OpenSuse 12.1, которыйиспользует системдвместо вашего классическогоСистема загрузки System V.

Для установки новой службы создайте следующий файл в /etc/systemd/system/myprogname.service

[Unit]
Description=My progname service file

[Service]
ExecStart=/home/bits/MyProgram

[Install]
WantedBy=multi-user.target

После этого бегите systemctl daemon-reloadиsystemctl start myprogname.service

Если вы хотите автоматически перезапустить MyProgname, вам нужно добавить

Restart=restart-always

в раздел обслуживания.

решение3

Вам нужно запустить telinit qinit, чтобы он перезагрузился /etc/inittab, он не сделает этого автоматически. Я думаю, вы сделали это, поскольку упомянули сообщение Re-reading inittab(вы ведь видели это сообщение, верно?) в системных журналах.

Проблема в том, что ваш процесс вообще не запускается или ваша программа дает сбой при запуске? Напишите скрипт-обертку, который перенаправляет ошибки в файл журнала:

#!/bin/sh
exec >/var/log/myprogram.log 2>&1 
exec /home/bits/MyProgram/start.myprogram

Проверьте, создан ли файл журнала, и посмотрите, нет ли в нем ошибок.

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

решение4

Когда initчитаетКомандадля выполнения в inittab, он разветвляет оболочку и отправляетКомандакак параметр команды execв этой оболочке. Итак, проверьте, что произойдет, если вы вручную выполните:

sh -c exec /home/bits/MyProgram/start.myprogram

Еще я бы попробовал вообще обойти скрипт запуска, используя что-то вроде этого в inittab:

bes:2345:respawn:/usr/bin/mono /home/bits/MyProgram/EmailServer.exe "$@"

Связанный контент