В настоящее время я работаю над проектом, в который необходимо добавить функцию, 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 q
init, чтобы он перезагрузился /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 "$@"