Под линухом необходимо что бы прога запускалась сама при старте ОС. Но, необходимо что бы в проге на ./ выдавалась именно её директория (а не директория ссылки), и имя программы было её (если запускать из rc.d по ссылке, argv[0] будет именем ссылки, что для меня не подходит).
Так же необходимо что бы программа запускалась всегда, не зависимо от уровня загрузки.
Линухи SuSe 6, RH 7
man inittab ?11.07.02 18:47 Автор: XR <eXtremal Research> Статус: The Elderman
Зачем такое извращение? Это не unixway. Запуску этой проги самое место в rc.local, что в SuSE, что в RedHat.
Для SuSE в /etc/init.d/ лежит sceleton, который очень легко руками правится под собственные нужды. Как вариант можно использовать для этой проги chroot. Вставить готовый скрипт запуска в нужные runlevels в СуСЕ очень легко с помощью insserv.
man chroot, man insserv.
Не знаю, есть ли в шапке insserv, но готовые скрипты при небольшой правке легко перекинуть с СуСИ в шапку.
не стоит так...12.07.02 16:29 Автор: XR <eXtremal Research> Статус: The Elderman
>Запуску этой проги
> самое место в rc.local, что в SuSE, что в RedHat. > > Для SuSE в /etc/init.d/ лежит sceleton, который очень > легко руками правится под собственные нужды. Как вариант > можно использовать для этой проги chroot. Вставить готовый > скрипт запуска в нужные runlevels в СуСЕ очень легко с > помощью insserv. > > man chroot, man insserv. > > Не знаю, есть ли в шапке insserv, но готовые скрипты при > небольшой правке легко перекинуть с СуСИ в шапку.
Проблема в том что человеку нужен запуск программы независимо от уровня загрузки ...
PS: Я кстати всегда складываю что то левое действительно в rc.local
а что толку ? Консоли то под него нет. А лог в файл я не предусмотрел (переписывать лениво !).
В inittab >mylog не напишишь.
Создал командный файл, поместил его в директории с экзешником.
#!sh
/..../my_pog >mylog
в inittab запускаю командный файл, НО my_log создается в корне ! В /
Что за фигня ? Почему вкорне, а не в /etc ?
К тому же my_log пуст. Пусть хотя первая команда проги - это printf. Прога работает, и работает давно, всегда по нормальному запускалась.
И еще, если лог создался в корне, то при попытки открыть файл в программе fopen( "./somefile" ); где он его искать будет ? Тоже в корне ?
Ладно, запустить то я его запустил...12.07.02 16:41 Автор: XR <eXtremal Research> Статус: The Elderman
> А лог в файл я не > предусмотрел (переписывать лениво !). > В inittab >mylog не напишишь. > Создал командный файл, поместил его в директории с > экзешником. > #!sh > /..../my_pog >mylog сделай ка вот так:
/../my_prog 1> /.../out.log 2> /../err.log
шоб разобраться с диагностикой ...
> в inittab запускаю командный файл, НО my_log создается в > корне ! В /
ну дык все правильно ...
pwd у тебя /
> Что за фигня ? Почему вкорне, а не в /etc ?
в скрипте можно поствить cd /etc но ImHO в таких случаях указывают полный путь ...
> К тому же my_log пуст. Пусть хотя первая команда проги - > это printf. Прога работает, и работает давно, всегда по > нормальному запускалась. > И еще, если лог создался в корне, то при попытки открыть > файл в программе fopen( "./somefile" ); где он его искать > будет ? Тоже в корне ?
Да - твоя прога наследует / от init
обычно в таких случаях указывают полный путь
Прикол вот в чем12.07.02 18:05 Автор: PS <PS> Статус: Elderman Отредактировано 12.07.02 18:07 Количество правок: 1
Как бы я вывод не перенаправлял, с 1,2 или без них - создаваемый файл - пуст !
А вот если никуда вывод не перенаправить, то при загрузке видна как она пишит: my_prog started..., интересно, а куда она будет писать дальше ? /proc/PID/fd/dev_console по прежнему пуст !!!
Внимание вопрос: почему этой строчки не оказывается в файле, куда перенаправляется stdout ?
Трабл в том, что я ей сейчас ничего кинуть не могу, что бы она мне о статусе сообщила (прога - сервачок, а клиентик не доступен).
Интересно, будет ли она и в дальнейшем так же молчаливо работать или соизволит писать в файл ?
И еще: есно в proc появляются мои открытые сокеты... хехе... никогда такое не делал, а интересно, из ОС в них что писать можно ? Сокеты типа INET, не LOCAL !
если тутда попытатся записать что либо vi , то ругается по страшному. Оно и понятно, но все же может как то можно ? ;)
Прикол вот в чем12.07.02 18:26 Автор: XR <eXtremal Research> Статус: The Elderman
> Как бы я вывод не перенаправлял, с 1,2 или без них - > создаваемый файл - пуст ! > А вот если никуда вывод не перенаправить, то при загрузке > видна как она пишит: my_prog started..., интересно, а куда > она будет писать дальше ? /proc/PID/fd/dev_console по > прежнему пуст !!! > Внимание вопрос: почему этой строчки не оказывается в > файле, куда перенаправляется stdout ?
Xmm...
Ты stdout и stderr часом не закрываешь в своей программе ? Она демон ?
> Трабл в том, что я ей сейчас ничего кинуть не могу, что бы > она мне о статусе сообщила (прога - сервачок, а клиентик не > доступен). > Интересно, будет ли она и в дальнейшем так же молчаливо > работать или соизволит писать в файл ? > > И еще: есно в proc появляются мои открытые сокеты... > хехе... никогда такое не делал, а интересно, из ОС в них > что писать можно ? Сокеты типа INET, не LOCAL ! > если тутда попытатся записать что либо vi , то ругается по > страшному. Оно и понятно, но все же может как то можно ? ;)
telnet localhost [твой порт]
и общайся с сервером руками :)
Во супер !12.07.02 18:54 Автор: PS <PS> Статус: Elderman
> Программа пишит всегда (перенаправленна в файл или нет) на > tty1. Почему именно на tty1 не понятно. Нравится ей наверно > :)
Ну тут мои телепатические способности кончаются и для более подробного
ответа больного надо бы в морг на вскрытие ;)
ну разве что попробуй
man console
man 4 tty
и man init до кучи
> > > Xmm... > > Ты stdout и stderr часом не закрываешь в своей > программе ? > > Она демон ? > > Не, не закрываю и не демон. Обычная прога.
Дык сделай все по уму:
1) сделай из нее демона (man daemon как вариант ... я правда делаю это все руками :))
2) логи пиши через сислог (man syslog)
3) посмотри как устроены аналоги
Ни какой телепатии !13.07.02 01:34 Автор: PS <PS> Статус: Elderman
Далее пишим батник, и обзываем его run:
#!/bin/sh
cd /root/test
./test
В inittab пишим: (я запускаюсь на третьем уровне, но это не принципиально !)
test:3:boot:/root/test/run
Даем команду reboot
Теперь можно наслаждаться надписями TEST на tty1
Когда надоест переправляем наш батник:
./test > log
Перезапускаемся. ОК, на экран ничего больше не сыпится. Идем в нашу директорию. Файл log появился. vi log. ОПС ! А он пуст ! И хде наши TEST ?!
Как видишь эксперемент примитивный и доступный всем. Чесно говоря смотреть что делается в ф-ии printk мне совсем в лом. Может кто нибудь объяснит что происходит ?
P.S. Переписывать свою прогу под демон, часть ядра и пр. не хочу.
P.P.S. Местом, что ниже спины чуял, что автозапуск в линухе имеет подводные камни.
Ни какой телепатии !15.07.02 13:28 Автор: XR <eXtremal Research> Статус: The Elderman
> > Ну тут мои телепатические способности кончаются и для > более > > подробного > > ответа больного надо бы в морг на вскрытие ;) > > В морг так в морг. > > Итак любой может провести эксперемент: > Пишим програмку: > > #include <stdio.h> > #include <unistd.h> > > int main() > { > for(;;) > { > printf( "TEST\n" ); > sleep( 2 ); > } > > return 1; > } > > Далее пишим батник, и обзываем его run: > #!/bin/sh > cd /root/test > ./test
Урок N 1
Никогда не называйте ваши программы так же как системные утилиты :)
man test
> В inittab пишим: (я запускаюсь на третьем уровне, но это не > принципиально !) > test:3:boot:/root/test/run > > Даем команду reboot > Теперь можно наслаждаться надписями TEST на tty1 > > Когда надоест переправляем наш батник: > ./test > log > > Перезапускаемся. ОК, на экран ничего больше не сыпится. > Идем в нашу директорию. Файл log появился. vi log. ОПС ! А > он пуст ! И хде наши TEST ?! > > Как видишь эксперемент примитивный и доступный всем. Чесно > говоря смотреть что делается в ф-ии printk мне совсем в > лом. Может кто нибудь объяснит что происходит ? > > P.S. Переписывать свою прогу под демон, часть ядра и пр. не > хочу. > P.P.S. Местом, что ниже спины чуял, что автозапуск в линухе > имеет подводные камни.
Урок N 215.07.02 14:03 Автор: XR <eXtremal Research> Статус: The Elderman
2) Пишем скриптик autoexec.sh
#!/bin/bash
cd /etc/rc.d
./xxx > /etc/autoexec.log
3) добавляем в /etc/inittab
xxx:::boot:/etc/rc.d/xxx
4) ребутим систему
5) находим в /etc/autoexec.log
вот такое вот
/dev/console
/dev/console
/dev/console
/dev/console
/dev/console
/dev/console
/dev/console
TEST
TEST
TEST
TEST
TEST
TEST
TEST
Для справки - дистрибутив Slackware 8.0
BTW: ну ка покажи ка вот что
---------------
ls -l /dev/tty[0-9] /dev/console
--------------
может у тебя в ЗуЗе чего не так с консолями ?
PS: вообще то для runlevel 3 такой фигне действительно место в rc.local
Ты немного подогнал тест. Если ты заметил - у меня нет выхода из проги.
Ты же его сделал ! Так и у меня работает (но это я понял, после того как прочел твой ответ).
Итак имеем буферизацию. Вернее очень на неё похоже.
Ну и как прикажешь мне с ней бороться ?
Вдогон15.07.02 17:47 Автор: XR <eXtremal Research> Статус: The Elderman
> Это ф-ия стандартной библиотеки. > Не я открываю файл. Его открывает командный интерпретатор, > и к этому файлу я не имею никакого отношения и доступа.
То есть ты уверен что данные заcтряли не в буфере твоей задачи а в буфере shell-а ;))) ?
Еще разок запусти как мой тестовый пример и убедись что сие не так Буферизуется printf
Для того чтобЫ сбрасывать ВСЕ буфера вызывай в цикле
fflush(NULL);
PS: Тут мы плавно переходим из раздела sysadmin в раздел программинг :)
Нет, мы остаемся в сисадмининге :)))16.07.02 14:56 Автор: PS <PS> Статус: Elderman
Только тема немного сменилась.
Теперь мы рассматриваем абстрактную програму, доступа к исходникам которой не имеем. А значит не можем в ней ничего изменить.
Итак, эта программа пишит в stdout, который буферизируется при перенаправлении в файл.
Вопрос: как средствами команд ОС сбросить этот буфер ?
Повторяю: программу менять не имеем права.