Есть ли способ узнать, выполняется ли команда `script` в текущем сеансе bash? - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь добавить в мой файл ~/.zshrc команду для записи входов и выходов командной строки. У меня есть команда script (https://www.tecmint.com/record-and-replay-linux-terminal-session-commands-using-script/), необходимая для выполнения, но у меня возникла проблема с ней, которая, похоже, бесконечно пытается записать мой сеанс. Я полагаю, что это связано с тем, что когда вы запускаете команду script, она запускает новый сеанс bash, который, в свою очередь, запускает ~/.zshrc, который затем пытается записать сеанс, который перезапускает сеанс (et c. и др c.). Это приводит к бесконечному количеству попыток записи сессии oop.

Попытка 1 Соответствующая часть моего ~/.zshrc

# RECORD COMMAND INPUT AND OUTPUT
LOG_PATH=/var/log/terminal/$(date +'%Y%m%d')
LOG_FILE=${LOG_PATH}/$(date +'%H%M%S').log
mkdir -p ${LOG_PATH}
script ${LOG_FILE}

This приводит к сеансу, который постоянно печатает следующее:

Script started, output file is /var/log/terminal/20200109/141849.log
Script started, output file is /var/log/terminal/20200109/141850.log
Script started, output file is /var/log/terminal/20200109/141851.log
Script started, output file is /var/log/terminal/20200109/141852.log
Script started, output file is /var/log/terminal/20200109/141853.log
Script started, output file is /var/log/terminal/20200109/141854.log
Script started, output file is /var/log/terminal/20200109/141855.log
... repeat infinitely ...

Попытка 2 Одна из попыток обойти эту проблему состояла в том, чтобы проверить, существует ли файл, и затем включить go с записью ( который работает несколько, но иногда он создает 2 файла, или иногда запись не начинается, скажем, если я открываю 2 сеанса команд в быстрой последовательности).

Обновленный сценарий

# RECORD COMMAND INPUT AND OUTPUT
# Check if the recording of a file for the given time has already started
# as it seems that once you start the script recording it re-starts the session
# which in turn re-runs this file which attempts to script again running into an infinite loop

LOG_PATH=/var/log/terminal/$(date +'%Y%m%d')
LOG_FILE=${LOG_PATH}/$(date +'%H%M%S').log
if [[ ! -f $LOG_FILE ]]; then
        mkdir -p ${LOG_PATH}
        script ${LOG_FILE}
fi

Опять это либо дает нет записи (в случае быстрого открытия 2 сессий) или это приводит к тому, что запись выполняется дважды

Script started, output file is /var/log/terminal/20200109/141903.log
Script started, output file is /var/log/terminal/20200109/141904.log

Попытка 3 Другая попытка была проверить историю bash и посмотреть если последняя команда содержала слово script. Проблема с этой попыткой заключалась в том, что сеанс bash, по-видимому, не имел истории при запуске и, следовательно, выдавал следующую ошибку (а затем бесконечно пытался начать сеанс записи, как первая попытка):

# RECORD COMMAND INPUT AND OUTPUT
# Check what the last command was to make sure that it wasn't the script starting
# as it seems that once you start the script recording it re-starts the session
# which in turn re-runs this file which attempts to script again running into an infinite loop

LAST_HISTORY=$(history -1)
if [[ "$LAST_HISTORY" != *"script"* ]]; then
        LOG_PATH=/var/log/terminal/$(date +'%Y%m%d')
        LOG_FILE=${LOG_PATH}/$(date +'%H%M%S').log
        mkdir -p ${LOG_PATH}
        script ${LOG_FILE}
fi

Вывод

Last login: Thu Jan  9 14:27:30 on ttys009
Script started, output file is /var/log/terminal/20200109/142754.log
Script started, output file is /var/log/terminal/20200109/142755.log
omz_history:fc:13: no such event: 0
omz_history:fc:13: no events in that range
Script started, output file is /var/log/terminal/20200109/142755.log
omz_history:fc:13: no such event: 0
omz_history:fc:13: no events in that range
Script started, output file is /var/log/terminal/20200109/142755.log
Script started, output file is /var/log/terminal/20200109/142756.log
^C%                                                                                                                                                                    danielcarmo@Daniels-MacBook-Pro-2 git %

Любые предложения или мысли по этому поводу будут высоко оценены.

Ответы [ 2 ]

2 голосов
/ 09 января 2020

script добавляет переменную SCRIPT в среду выполняемой команды. Вы можете проверить это, чтобы решить, нужно ли запускать script.

# RECORD COMMAND INPUT AND OUTPUT
log_path=/var/log/terminal/$(date +'%Y%m%d')
log_file=${log_path}/$(date +'%H%M%S').log
mkdir -p "${log_path}"
<b>[ -z "$SCRIPT" ] && </b>script "${log_file}"

Значение SCRIPT - это имя файла, в который выполняется вход.

1 голос
/ 09 января 2020

Вместо того, чтобы пытаться выяснить, работает ли script, просто оставьте себе крошку:

if [ -z "$BEING_LOGGED" ]
then
  export BEING_LOGGED="yes"
  LOG_PATH="/var/log/terminal/$(date +'%Y%m%d')"
  LOG_FILE="${LOG_PATH}/$(date +'%H%M%S').log"
  mkdir -p "${LOG_PATH}"
  exec script "${LOG_FILE}"
fi

При первом получении файла BEING_LOGGED будет сброшено. Когда script вызван и файл снова получен, он будет установлен, и вы можете пропустить ведение журнала.

...