В то время как мы идем od
и hexdump
, два более подобных инструмента:
Демонстрационный вывод:
$ 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
Если Вы хотите, чтобы демон считал вход, произведенный некоторым произвольным процессом, необходимо подключить тот процесс к каналу. Здесь произвольный процесс - Вы команды повторения, и он собирается работать в другом контексте. Поэтому создайте именованный канал (часто названный 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
директива.
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