Есть сценарий PowerShell, из которого я выполняю следующую команду: putty.exe -ssh user@srv -pw password -m Execute_Command_File -t

Во время выполнения сценария tailf /dir/log/ записывается в Execute_Command_File. После выполнения скрипта открывается запрашиваемая сессия и работает tailf .

Проблема, когда я пытаюсь выйти из tailf(ctrl+C), он закрывает терминал.

Пытался добавить /bin/bash в конце Execute_Command_File , не помогая. И конечно же попробовал tail -f/F , тоже не работает ...

Есть идеи?

1 ответ1

1

Бывает, что tail умирает из-за CTRL+C, но он также отправляется (SINGINT) родителю, bash . Так как по умолчанию bash умирает при получении такого сигнала, вы должны заменить поведение bash по умолчанию, когда его получаете.

Используйте встроенную команду trap от bash(1) чтобы изменить это.

Следующий скрипт tailf-ctrl.sh является демо-версией и показывает ответ:

#!/bin/bash
function finish {
    echo "CTRL-C pressed!"
}

F=testfile

echo hello > $F
# set custom action
trap finish SIGINT # comment this to see the problem
tail -f $F
# reset default action
trap - SIGINT

echo "Hello after" > after
cat after

Обратите внимание, что:

  1. SIGINT - это сигнал, связанный с CTRL+C
  2. первая ловушка устанавливает пользовательское действие, связанное с сигналом SIGINT
  3. поведение по умолчанию для второй ловушки сброса сигнала SIGINT

Вывод скрипта:

$ bash tailf-ctrl.sh 
hello
^CCTRL-C pressed!
Hello after

это показывает, что второй файл написан так, что конец скрипта достигается, когда tail умирает из-за CTRL-C .

если вы закомментируете первую команду trap, вы увидите, что ваша проблема появляется: bash немедленно завершается, и вывод должен быть:

$ bash tailf-ctrl.sh 
hello
^C
$

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .