Страниц: [1]
  Печать  
Автор Тема: Дублирование системного stdout в файл  (Прочитано 5564 раз)
Camarada
Full Member
***
Offline Offline

Сообщений: 222


Просмотр профиля
« : Апреля 17, 2013, 09:26:08 am »

Есть отличная тулза tee, которая позволяет дублировать вывод команды в файл, не переставая выводить в stdout
В моем bsh-скрипте сейчас делается так

Код:
touch /dev/shmem/system_out.txt
reopen /dev/shmem/system_out.txt

что естественно перекрывает стандартную консоль, которая выведена у меня в UART.
Задача сохранить возможность работы с консолью, при этом stdout и stderr выводить в пресловутый /dev/shmem/system_out.txt
Записан
oder
Гость
« Ответ #1 : Апреля 17, 2013, 09:47:04 am »

Вы понимаете, что когда данные пишутся в дескриптор файла - они попадают только в то одно место, на которое указывает дескриптор файла? Исключением может быть, лишь когда дескриптор указывает на менеджер ресурсов, дублирующий данные в два места. Вот и дерзайте.  Wink
Записан
Camarada
Full Member
***
Offline Offline

Сообщений: 222


Просмотр профиля
« Ответ #2 : Апреля 17, 2013, 10:13:58 am »

Вы понимаете, что когда данные пишутся в дескриптор файла - они попадают только в то одно место, на которое указывает дескриптор файла? Исключением может быть, лишь когда дескриптор указывает на менеджер ресурсов, дублирующий данные в два места. Вот и дерзайте.  Wink

devc переписывать крайне не хочется, да и неправильно это Smiley
А как же работает tee? Скорее всего создает свой resmgr, вот я и думаю, как бы прикрутить этот tee к системному выводу.
Записан
darkelf
QOR.Moderator
*****
Offline Offline

Сообщений: 256


Просмотр профиля
« Ответ #3 : Апреля 17, 2013, 12:32:46 pm »

Вы понимаете, что когда данные пишутся в дескриптор файла - они попадают только в то одно место, на которое указывает дескриптор файла? Исключением может быть, лишь когда дескриптор указывает на менеджер ресурсов, дублирующий данные в два места. Вот и дерзайте.  Wink

devc переписывать крайне не хочется, да и неправильно это Smiley
А как же работает tee? Скорее всего создает свой resmgr, вот я и думаю, как бы прикрутить этот tee к системному выводу.
tee, упрощенно выглядит так (без всяких менеджеров ресурсов):

Код:
#include <stdio.h>

int main(int argc, char* argv[])
{ int rez = 0;
  FILE* fout;
  char str[4096];

  if ((fout = fopen(argv[1], "wt")) == NULL)
  { perror("tee: fopen");
      return 1;
  }

  while(!feof(stdin))
  { if (fgets(str, sizeof(str), stdin) == NULL)
      break;
    fputs(str, stdout);
    fflush(stdout);
    fputs(str, fout);
  }
  fclose(fout);
  return rez;
}
« Последнее редактирование: Апреля 17, 2013, 12:34:42 pm от darkelf » Записан
Camarada
Full Member
***
Offline Offline

Сообщений: 222


Просмотр профиля
« Ответ #4 : Апреля 18, 2013, 08:42:55 am »

Спасибо, однако ж с системным выводом так не получится. А что такое псевдотерминал, может его как-то можно использовать в этом вопросе?
Записан
darkelf
QOR.Moderator
*****
Offline Offline

Сообщений: 256


Просмотр профиля
« Ответ #5 : Апреля 18, 2013, 09:30:17 am »

Спасибо, однако ж с системным выводом так не получится. А что такое псевдотерминал, может его как-то можно использовать в этом вопросе?
Сорри, давно уже не занимаюсь QNX, но что, если написать что-то типа:
Код:
reopen /dev/serX
my_prog1 | tee -a /dev/shmem/system_out.txt
my_prog2 | tee -a /dev/shmem/system_out.txt
где /dev/serX - Ваш UART, ну или вообще без reopen
Записан
Camarada
Full Member
***
Offline Offline

Сообщений: 222


Просмотр профиля
« Ответ #6 : Апреля 18, 2013, 01:42:55 pm »

Спасибо, однако ж с системным выводом так не получится. А что такое псевдотерминал, может его как-то можно использовать в этом вопросе?
Сорри, давно уже не занимаюсь QNX, но что, если написать что-то типа:
Код:
reopen /dev/serX
my_prog1 | tee -a /dev/shmem/system_out.txt
my_prog2 | tee -a /dev/shmem/system_out.txt
где /dev/serX - Ваш UART, ну или вообще без reopen

Ну да, можно конечно для каждой программы так делать, но у меня их тучи, а я хотел настраиваемой эту фичу сделать.
И да, оператор pipe в bootscript не работает. Как и например > (поэтому и делается reopen). Если не ошибаюсь.

Записан
darkelf
QOR.Moderator
*****
Offline Offline

Сообщений: 256


Просмотр профиля
« Ответ #7 : Апреля 18, 2013, 02:04:16 pm »

Ну да, можно конечно для каждой программы так делать, но у меня их тучи, а я хотел настраиваемой эту фичу сделать.
И да, оператор pipe в bootscript не работает. Как и например > (поэтому и делается reopen). Если не ошибаюсь.
Как вариант - попробуйте в секцию запуска, которая [+script] добавить запуск esh, который уже будет запущен с обычным shell-скриптом, в котором поддерживаются и pipe, и перенаправление вывода. Правда не знаю возможно ли такое в mkifs.
Т.е. получится нечто подобное:
Код:
[+scripts]
esh -c /path/to/init.sh

в init.sh, для общего перенаправления, можно вызвать ещё раз esh:

Код:
#!/bin/esh
esh -c /path/to/realinit.sh | tee -a /dev/shmem/system_out.txt

а уже в realinit.sh
просто запускать программы:

Код:
my_prog1 &
my_prog2 &
Записан
Camarada
Full Member
***
Offline Offline

Сообщений: 222


Просмотр профиля
« Ответ #8 : Апреля 18, 2013, 03:10:52 pm »

Это идея
Код:
sh -c "qconf | tee /dev/shmem/log.txt"
из bootscript

Едит, только pipe надо предварительно поднять
« Последнее редактирование: Апреля 18, 2013, 03:31:02 pm от Camarada » Записан
aluv
Sr. Member
****
Offline Offline

Сообщений: 301


Просмотр профиля
« Ответ #9 : Апреля 18, 2013, 04:11:44 pm »

Вот вспомнился подходящий проект LiLaLo:
http://xgu.ru/wiki/LiLaLo
Тут в журнал пишется гораздо больше: код завершения команды, время ввода команды, что в текстовом редакторе поменяли и т.п.
Вот пример журнала:
http://xgu.ru/l3/trainings/f2f/bat/2006-06-26/fbsd.unix.nt/root
Записан
Camarada
Full Member
***
Offline Offline

Сообщений: 222


Просмотр профиля
« Ответ #10 : Апреля 18, 2013, 04:19:58 pm »

Забавная проблема получается.
При запуске
Код:
sh -c "qconf | tee file"
tee работает правильно, вывод происходит и в порт и в файл, однако, несмотря на то, что qconf отрабатывает и исчезает из списка процессов, tee не завершается, как и sh, который вызвал его.
sh висит в состоянии SigSuspend
tee висит в состоянии Reply от pipe

Дедлок какой-то вышел.
Да, если убить процесс tee, то команды следующие за ней будут исполняться.
« Последнее редактирование: Апреля 18, 2013, 04:30:05 pm от Camarada » Записан
Camarada
Full Member
***
Offline Offline

Сообщений: 222


Просмотр профиля
« Ответ #11 : Апреля 18, 2013, 04:25:17 pm »

Вот вспомнился подходящий проект LiLaLo:
http://xgu.ru/wiki/LiLaLo
Тут в журнал пишется гораздо больше: код завершения команды, время ввода команды, что в текстовом редакторе поменяли и т.п.
Вот пример журнала:
http://xgu.ru/l3/trainings/f2f/bat/2006-06-26/fbsd.unix.nt/root


Спасибо, но мне такого наверное и не нужно.

В общем я решил пока особо не запариваться, перенаправил вывод в qconf, где запускаются все драйвера и процессы, а ksh путь себе стартует, другое дело, что если ядро выплюнет какую-то бяку, а я этого так и не увижу.
« Последнее редактирование: Апреля 18, 2013, 04:53:14 pm от Camarada » Записан
T_i_m_u_r_l_a_n
Участник
*
Offline Offline

Сообщений: 30


Просмотр профиля
« Ответ #12 : Февраля 21, 2015, 12:03:44 pm »

попробуй обойтись без /dev/shmem более стабильно будет imho
Записан
Dark
Sr. Member
****
Offline Offline

Сообщений: 343


Просмотр профиля
« Ответ #13 : Февраля 21, 2015, 12:30:28 pm »

Бот некрофил детектед  Cheesy
Записан
Страниц: [1]
  Печать  
 
Перейти в: