Символ Echo Control C
Мне нужно выполнить grep вывод сторонней программы. Эта программа выгружает данные, но не прерывается, не нажимая ^ c, чтобы завершить ее.
В настоящее время я ищу и убиваю его, используя свой pid. Тем не менее, мне было интересно, если бы можно было отследить контрольный символ C. Псевдо код будет выглядеть как
echo ^c | ./program_that_does_not_terminate
Я могу сделать что-то подобное в DOS, поэтому в Linux должен быть способ.
C:\>echo y | del C:\tmp\*
C:\tmp\*, Are you sure (Y/N)? y
C:\>
Ответы
Ответ 1
Нет, пересылка символа CTRL-C в ваш процесс не будет работать, потому что нажатие клавиши CTRL-C захватывается терминалом и транслируется в сигнал уничтожения, отправленный процессу.
Правильный код символа (в ASCII) для CTRL-C - это код 3, но, если вы отгоните это на свою программу, он просто получит символ из своего стандартного ввода. Это не приведет к завершению процесса.
Если вы хотите облегчить задачу поиска и убийства процесса, вы можете использовать что-то вроде:
./program_that_does_not_terminate &
pid=$!
sleep 20
kill ${pid}
$!
предоставит вам идентификатор процесса для последнего запущенного фонового процесса.
Ответ 2
В Bash a ^C
может быть передан как аргумент в командной строке (и, таким образом, передан в echo
для эха), написав $'\cc'
. Таким образом, желаемая команда:
echo $'\cc' | ./program_that_does_not_terminate
Ответ 3
Попробуйте следующее:
expect -c "send \003;"
Ответ 4
Думаю, вам понадобится нечто более сложное. Если вы хотите захватить вывод программы, вы не можете сразу отправить сигнал об уничтожении в программу. По сравнению с приведенным выше примером команда del
ожидает ввода, а CTRL + C не является прямым вводом, а является сигналом kill.
Я бы предложил решение, в котором вы определяете, будет ли весь вывод захвачен и после этого отправить сигнал уничтожения. Hoever, момент времени, когда весь вывод может быть определен только вами.
Ответ 5
Как сказал @paxdiablo, нажатие клавиши CTRL-C фиксируется терминалом и преобразуется в сигнал уничтожения, отправляемый процессу. Поэтому, если ваш процесс подключен к терминалу, вы можете отправить $ '\ cc', предоставленный @jwodder, этому терминалу, позволяя терминалу отправлять фактический сигнал уничтожения процессу.
Шаг:
1. Скомпилируйте файл C в разделе Выполнить команду в другом терминале через /dev/pts.
2. sudo./a.out -n/dev/pts/0 $'\cc'
# изменить /dev/pts/0 на tty, к которому прикреплен ваш процесс