Для нахождения, какие аргументы были переданы pdnsd я сделаю:
[~]> pgrep -l pdnsd
1373 pdnsd
[~]> cat /proc/1373/cmdline
/usr/sbin/pdnsd--daemon-p/var/run/pdnsd.pid[~]>
(cmdline
записи файла разделяются нулевыми символами; используйте что-то как tr '\0' '\n' </proc/<pid>/cmdline
видеть более четкий вывод.)
/proc/<pid>/
содержит большую информацию.
Действительно mplayer
сохраняет его собственный указатель в файл, таким образом, он не замечает когда echo
записи к нему. Когда Вы имеете несколько программ, пишущих в файл, принимаете меры, чтобы все они открылись, файл в добавляют режим. В добавляют режим, каждая запись происходит в конце файла. От оболочки это >>
. Создайте пустой файл с : >events.log
если Вы хотите начать заново, затем работать mplayer … >>events.log
.
Обратите внимание, что, в то время как это гарантирует, что каждый байт из любой программы закончится в файле, нет в принципе никаких гарантий, что они не будут вкраплены: в теории, echo hello >>events.log
мог привести к h
, затем некоторый вывод mplayer, затем e
, и т.д. появляясь в файле. На практике, на большинстве, если не все системы, команда эха, печатающая самое большее 512 байтов, закончится в одной части.
Примечание. Это - ответ на мой собственный вопрос
Следующий метод работает вполне хорошо. Это отправляет, ряд несвязанных нажатий клавиш к mplayer (mplayer регистрирует эти недопустимые нажатия клавиш). Каждая нажатая клавиша выбрана для представления одной десятичной цифры, например, отправки F2 F5 F7
представляет десятичное число 257
. Отправка 6 чисел цифры занимает приблизительно 0,2 секунды. Метка времени взята от строки журнала незадолго до первого (заголовок) нажатие клавиши. Это избегает всех проблем assiciated с кэшированием задержек, как упомянуто в ответе Gilles.
Это может быть выполнено очень легко от emacs
просто переместившись point
(курсор) к другой строке, или путем нажатия определенной клавиши (что код не здесь, но я ожидал бы, что это будет достаточно просто (я плохо знаком с elisp). Вот кодированное и альфа-протестированное решение...
# Insert a number (input to this script) into mplayer's log;
# Each digit of the input number is translated into
# a key-press for which mplayer does not have a binding.
# mplayer makes a log entry for each invalid key-press.
# The log entry identifies the key, so the entry can be
# translated back into its original decimal value
#
# A leading and a trailing marker are also sent to mplayer
#
# A simple parsing of the log can rebuild the original
# number and the time within the media stream when it occurred.
#
num=${1:-123456} # Default if for testing only
shopt -s extglob # For splitting the input number
# Window ID ($2) Defaults to win whose title == $USER@$HOSTNAME.*
win=${2:-$(($(wmctrl -l | sed -nr "s/^([^ ]+).* $USER@$HOSTNAME.*/\1/p")))}
# ========== ===== === # Key-press translation array
# 0123456789 begin end # decimal digits and delimiters
key=(F12 F{1..9} c \') # key names
# ========== ===== === #
xdotool key --window $win ${key[10]} # HEAD Marker
for i in ${num//?(.)/ } ;do
xdotool key --window $win ${key[i]} # Encoded decimal digit
done
xdotool type --window $win ${key[11]} # TAIL Marker
Вот 3 процесса продолжения шага для извлечения метки времени и числа (номер строки или смещение байта/символа в исходном тексте)...
# (1) Each line of mplayer's normal output (vs errors) ends
# witn `\x1B\[J\x0D`. First, convertd this to `\n`
sed -nr 's/\x1B\[J\x0D/\n/gp' mplayer.log >/dev/null
# (2) The above pre-processing step(1) can be piped to the next sed step,
# but I've redirected it to /dev/nul for this example
# The following step works with a few lines of the pre-processed log
nbfk="No bind found for key"
sed -nr "
/^$nbfk 'c'\./,/^$nbfk '''\./{
/^$nbfk 'c'\./{g # HEAD Marker found
s/^A: *([0-9.]+).*/000000\1/
s/^0*([0-9]{6}\..*)/T:\1/p
}
s/^$nbfk 'F12'\..*/0/p # Digit
s/^$nbfk 'F([1-9])'\..*/\1/p # Digit
s/^$nbfk '''\..*/--/p # TAIL Marker found
}
h" <<'EOF'
A: 18.6 (18.6) of 3207.0 (53:27.0) 0.1%
A: 18.7 (18.6) of 3207.0 (53:27.0) 0.1%
No bind found for key 'c'.
A: 18.7 (18.6) of 3207.0 (53:27.0) 0.1%
No bind found for key 'F1'.
A: 18.7 (18.7) of 3207.0 (53:27.0) 1.0%
No bind found for key 'F2'.
A: 18.7 (18.7) of 3207.0 (53:27.0) 0.1%
A: 18.8 (18.7) of 3207.0 (53:27.0) 0.1%
No bind found for key 'F3'.
A: 18.8 (18.8) of 3207.0 (53:27.0) 0.1%
No bind found for key 'F4'.
A: 18.8 (18.8) of 3207.0 (53:27.0) 0.1%
No bind found for key 'F5'.
A: 18.9 (18.8) of 3207.0 (53:27.0) 0.1%
No bind found for key 'F6'.
A: 18.9 (18.8) of 3207.0 (53:27.0) 0.1%
No bind found for key '''.
A: 18.9 (18.9) of 3207.0 (53:27.0) 0.1%
A: 19.0 (18.9) of 3207.0 (53:27.0) 0.1%
EOF
# (3) The above step(2) can be piped to the next sed step,
# but I've let it go to stdout for this example
# The following example step works with output of step (2)
sed -nr "
/^T:[0-9.]+$/,/^--$/{
/^T:[0-9.]+$/{ s/^T:(.*)/\1 /; h}
/^[0-9]$/H
/^--$/{g; s/\n//g; p}
}" <<'EOF'
T:000018.7
1
2
3
4
5
6
--
EOF
Вот окончательный результат: time in seconds
и тест line number
000018.7 123456