Как я делаю сценарий оболочки, который отправляет вывод в процесс

В то время как мы идем od и hexdump, два более подобных инструмента:

  • HD (от bsdmainutils)
  • xxd (часть Vim)

Демонстрационный вывод:

$ hd /usr/bin/od | head
00000000  7f 45 4c 46 01 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 03 00 01 00 00 00  20 8e 04 08 34 00 00 00  |........ ...4...|
00000020  a4 a2 00 00 00 00 00 00  34 00 20 00 08 00 28 00  |........4. ...(.|
00000030  1b 00 1a 00 06 00 00 00  34 00 00 00 34 80 04 08  |........4...4...|
00000040  34 80 04 08 00 01 00 00  00 01 00 00 05 00 00 00  |4...............|
00000050  04 00 00 00 03 00 00 00  34 01 00 00 34 81 04 08  |........4...4...|
00000060  34 81 04 08 13 00 00 00  13 00 00 00 04 00 00 00  |4...............|
00000070  01 00 00 00 01 00 00 00  00 00 00 00 00 80 04 08  |................|
00000080  00 80 04 08 c4 9d 00 00  c4 9d 00 00 05 00 00 00  |................|
00000090  00 10 00 00 01 00 00 00  00 a0 00 00 00 20 05 08  |............. ..|

$ xxd /usr/bin/od | head
0000000: 7f45 4c46 0101 0100 0000 0000 0000 0000  .ELF............
0000010: 0200 0300 0100 0000 208e 0408 3400 0000  ........ ...4...
0000020: a4a2 0000 0000 0000 3400 2000 0800 2800  ........4. ...(.
0000030: 1b00 1a00 0600 0000 3400 0000 3480 0408  ........4...4...
0000040: 3480 0408 0001 0000 0001 0000 0500 0000  4...............
0000050: 0400 0000 0300 0000 3401 0000 3481 0408  ........4...4...
0000060: 3481 0408 1300 0000 1300 0000 0400 0000  4...............
0000070: 0100 0000 0100 0000 0000 0000 0080 0408  ................
0000080: 0080 0408 c49d 0000 c49d 0000 0500 0000  ................
0000090: 0010 0000 0100 0000 00a0 0000 0020 0508  ............. ..

Или, если Вы хотите считать байты по одному и распечатать их в Вашем собственном формате, попробуйте что-то как:

while read -n 1 byte; do
    ord=$(printf "%b" "${byte:-\000}" |
          od -t x1 |
          { read offset hex; echo $hex; })
    echo "$ord"
done </usr/bin/od

Демонстрационный вывод:

7f
45
4c
46
01
01
01
00
00
00
11
07.02.2018, 02:51
1 ответ

Читайте из канала, запишите в файл

Если Вы хотите, чтобы демон считал вход, произведенный некоторым произвольным процессом, необходимо подключить тот процесс к каналу. Здесь произвольный процесс - Вы команды повторения, и он собирается работать в другом контексте. Поэтому создайте именованный канал (часто названный FIFO в контекстах Unix).

mkfifo /var/run/daemon.fifo
</var/run/daemon.fifo /path/to/daemond --option >daemon.log

И просто запишите команды в канал:

echo 'FORWARD 10' >/var/run/daemon.fifo
echo 'LEFT 72' >/var/run/daemon.fifo

Это вряд ли будет работать, как однако: существует хороший шанс, что демон выйдет, когда это будет видеть конец файла на его стандартном входе, который происходит, как только первый процесс, который пишет в канал, завершается. Можно использовать tail -f избегать той проблемы.

</var/run/daemon.fifo tail -c +1 -f | {
  echo $$ >/var/run/daemon.pid
  exec /path/to/daemond --option >daemon.log
}

С некоторыми tail реализации, Вы можете быть укушены путем буферизации: tail процесс будет ожидать, пока он не накопил достаточно байтов для испускания некоторого вывода. Я не думаю, что это разрешимо на панели инструментов POSIX; если это - проблема, используйте тривиальный C или программу Python или Perl. Насколько я могу сказать tail от GNU coreutils (как найдено на Linux и в другом месте) безопасно на этом уважении.

Когда Вы останавливаете демона, echo >/var/run/daemon.fifo уничтожит tail процесс.


Запуск программы в экране

Вместо того, чтобы вызвать демона непосредственно от Вашего менеджера по сервису (Вы действительно используете просто SysV init или что-то дополнительное как сценарии обертки или Выскочка?), вызвать

screen -c daemon.screenrc -L -d -m -S daemon_name /path/to/daemond --option

Так как демон не будет дочерним процессом менеджера по сервису, необходимо удостовериться, что отправили сигнал в правильный процесс. Как сделать, который зависит от точно, как демон запускается и какой.

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

-L опция заставляет экран записать все, что появляется в его окне в файл. Имя файла подано daemon.screenrc с logfile директива.

9
27.01.2020, 19:59
  • 1
    На самом деле я действительно хотел бы смочь отправить сообщения в, он - stdin из сценария - возможно, это - вопрос, который я должен был задать. В настоящее время я просто выполняю сервер из сценария и могу ввести к нему в терминале, но просто кажется, что он должен работать как услуга... –  Bill K 23.12.2010, 00:46
  • 2
    @Bill: хорошо, я вижу. Затем первой вещью, которая прибывает по моему мнению, является именованный канал. –  Gilles 'SO- stop being evil' 23.12.2010, 01:43
  • 3
    я думаю, что это точно, что я хочу @Gilles! Я должен понять это лучше все же. Я проведу некоторое время, сортируя страницы справочника для понимания этого - я честно получаю очень мало того (я получаю максимум от того, что Вы делаете и почти ни один из как Вы сделали это - и я думал, что у меня отчасти была подсказка с этим материалом.) Моя теория не должна была соединяться непосредственно с процессом, но создать еще один сценарий, который присоединился, это - i/o к deamons o/i, чтобы заставить его казаться, что исходная консоль работает, но со способностью сделать, эхо 'ПЕРЕДАЕТ 10' из другого сценария одновременно. –  Bill K 23.12.2010, 02:06
  • 4
    я думаю, что получаю большую часть его. Если я ломаю его, я теперь понимаю "mkfifo канал" и "хвост-f канал | команда> вывод", протестировали они, и они работают. Я думаю большая часть другого материала, у Вас были приемы, должен был заставить это работать на одной строке - я пропускаю что-либо критическое? –  Bill K 23.12.2010, 02:23
  • 5
    @Bill: Вы могли записать в терминал, внутри скрывают с внешней стороны (использующий экран stuff команда). Но Вам не нужны издержки (обработка, но самое главное познавательный) терминала здесь, канал почти достаточно (это достаточно с небольшим end-of-file-ignoring релейным процессом). Можно хотеть экспериментировать немного с <fifo cat или <fifo tail -f | cat в одном терминале и echo >fifo; echo >fifo в другом терминале; я думаю, что Вы будете в порядке. –  Gilles 'SO- stop being evil' 23.12.2010, 02:43

Теги

Похожие вопросы