То, что это делает, совершенно специализировано. При нажатии ctrl+c эмулятор терминала отправляет сигнал SIGINT в приоритетное приложение, которое инициировало соответствующий "обработчик сигналов". Обработчик сигналов по умолчанию для SIGINT завершает приложение. Но любая программа может установить свой собственный обработчик сигналов для SIGINT (включая обработчик сигналов, который не останавливает выполнение вообще).
По-видимому, vlc устанавливает обработчик сигналов, который пытается сделать некоторую очистку / корректное завершение на первый раз, когда это вызывается и отступает к поведению по умолчанию немедленно завершающегося выполнения, когда это вызывается во второй раз.
Опция 1 состояла бы в том, чтобы изменить исходный код приложения вызова и вставить tee
в вывод конвейерно обрабатывают для получения копии вывода для обзора на том этапе.
Опция 2 состояла бы в том, чтобы записать сценарий обертки вокруг рассматриваемого исполняемого файла. Быстрый сценарий, который передает stdin и аргументы реальному приложению, затем мишень вывод к местоположению для Вас для рассмотрения и также слюна, это отступает тот же путь приложение, был бы, должна быть просто пара строк, чтобы сделать на скорую руку. Поместите его где-нибудь особенный и сделайте, добавляют, что местоположение к передней стороне Вашей переменной ПУТИ, затем запустите свое приложение.
#!/bin/sh
cat - | /path/to/realapp $@ | tee /tmp/debug_output
Можно получить большую информацию о программе путем вызова его под strace
. Это показывает каждый системный вызов, что программа делает, который может иногда быть слишком большой информацией, но может быть большой справкой для нахождения то, что идет не так, как надо.
Приблизьтесь нужно запустить Ваше большое приложение под strace
. Это, вероятно, произведет большой вывод и замедлит Ваше приложение.
strace -s9999 -efile,process -f -o bigapp.strace bigapp
Если большое приложение является интерактивным, можно предпочесть запускать его и подключать strace к нему, после того как Вы готовы инициировать вычисления. Отметьте идентификатор процесса приложения, скажите 12345 и работайте
strace -s9999 -efile,process -f -o bigapp-calculations.strace -p12345
Если достаточно заметить, что внешний исполняемый файл, то как другое ответы уже предложили, заменяет тот исполняемый файл сценарием обертки. Можно переместить исполняемый файл в другое имя и положить сценарий обертки на его место или поместить сценарий обертки перед обычным исполняемым файлом в PATH
, или настройте приложение для вызова сценария обертки вместо обычного исполняемого файла, независимо от того, что удобно. Сделайте тот сценарий обертки
#!/bin/sh
exec strace -s9999 -efile -o auxapp-$$.strace /path/to/original/executable "$@"
Объяснение strace параметров использовало:
-e
выбирает системные вызовы трассировки. Можно указать системные вызовы по имени или использовать несколько категорий такой как file
(open
, close
, read
, write
, …) и process
(fork
, execve
, …).-f
делает strace, следует за ветвлениями, т.е. подпроцессами трассировки, а также исходным процессом.-o
выбирает название файла, содержащего трассировку. $$
конструкция оболочки, которая обозначает идентификатор процесса процесса оболочки (из-за использования exec
в последнем сценарии обертки, который также будет идентификатором процесса дополнительного приложения).-s9999
заставляет его отобразить это много байтов для read
и write
и другие вызовы.Вместо того, чтобы изменять Ваш путь, необходимо переместить двоичный файл, которым Вы интересуетесь от "двоичного файла" до "binary.orig", затем заменяют его сценарием. Вы сказали, что интересуетесь аргументами, таким образом, Вы захотите выписать аргументы в файл также. Вы будете, вероятно, также интересоваться выводом команды "ENV". Это выводит все в настоящее время активные переменные среды. Переменные среды часто используются одной программой для влияния на поведение другой программы, которую это называет.
У меня работает следующее:
cat - | tee /tmp/in.log | /path/to/realapp $@ | tee /tmp/out.log