Для проверки существующего сеанса tmux
(и запуска нового сеанса в фоновом режиме, если такового не существует), используйте
if ! tmux has-session 2>/dev/null; then
tmux new-session -d
fi
Для проверки сеанса с определенным именем:
if ! tmux has-session -t name 2>/dev/null; then
tmux new-session -d -s name
fi
В качестве оболочки function:
start_tmux () {
set -- "${1:-servercontrol}"
if ! tmux has-session -t "$1" 2>/dev/null; then
tmux new-session -d -s "$1"
fi
}
Может использоваться как
$ start_tmux
или
$ start_tmux mysession
Вы можете оставить файл открытым:
exec 3< file
cat <&3
sleep 3600
echo After one hour, these records were added:
cat <&3
Это означает, что это должен быть тот же процесс, вызывающий те cat
одночасовые апартаменты.
Если в файловой системе включено время доступа, и ваш сценарий - единственное, что читает этот файл, вы также можете прочитать строки, метка времени которых соответствует дате последнего доступа. В системе GNU:
awk -v last_access="$(find file -prune -printf %AFT%AT)" '
$0 > last_access' < file
Предполагается, что -04: 00
в файле журнала соответствует текущему смещению часового пояса.
Другой подход - записать текущую позицию файла где-нибудь, например, в file.pos
:
{
if [ -e file.pos ]; then
pos=$(cat file.pos)
else
pos=0
fi
tail -c +"$((pos+1))"
perl -le 'print tell STDIN' > file.pos
} < file
Или с ksh93
{
if [ -e file.pos ]; then
pos=$(<file.pos)
else
pos=0
fi
cat <#((pos))
exec <#((pos=CUR))
echo "$pos" > file.pos
} < file
Или с zsh
:
zmodload zsh/system
{
if [ -e file.pos ]; then
pos=$(<file.pos)
else
pos=0
fi
sysseek $pos
cat
echo "$((systell(0)))" > file.pos
} < file
#!/bin/bash
logfile="$1"
test -f "$logfile" || exit 1
lastline="$( basename "$logfile" )-last"
if [ -f "$lastline" ]; then
place=$( <"$lastline" )
else
place=1
fi
tmpfile="$( mktemp )"
trap 'rm -f "$tmpfile"' EXIT
sed -n -e "$place,\$p" -e '$=' "$logfile" |
tee "$tmpfile" |
tail -n 1 >"$lastline"
sed '$d' "$tmpfile"
Этот небольшой сценарий возьмет файл журнала в командной строке и покажет все строки в нем, добавленные с момента последнего использования сценария. Он не поддерживает ротацию файлов журнала в его текущей форме , поэтому вам придется вручную удалить файл ...- последний
, который он создает в текущем каталоге, если журнал вращается. .
Что он делает:
При первом запуске он использует sed
для вывода всех строк заданного файла журнала во временный файл, за которым следует номер последней строки. Этот номер также сохраняется в файле в текущем каталоге с тем же именем, что и файл журнала, с суффиксом -last
. Затем временный файл без последней строки, содержащей номер строки, выводится на терминал (если хотите, направьте вывод скрипта в меньше
). Когда сценарий завершает работу, временный файл удаляется.
При повторном запуске номер строки считывается из файла ...- last
в текущем каталоге, и содержимое файла журнала обрабатывается с этого номера и до конца аналогичным образом. как прежде.
Если между запусками этого сценария в файл журнала не поступало никаких данных. Будет отображена последняя строка файла журнала.
Запуск:
$ bash script.sh /var/log/system.log
[lots of output]
$ ls system*
system.log-last
$ cat system.log-last
14758
$ bash script.sh /var/log/system.log
[a few lines of output,
with the first line being the same as the last of the previous run]
$ cat system.log-last
14768
Существует утилита командной строки (от 2003 )под названием Re -Tail или «retail», которая выполняет инкрементное чтение файла журнала каждый раз, когда вы запускаете программу в файле журнала.
Это отлично подходит, например, для заданий cron, которые запускаются каждый час.
Re -Tail сохраняет состояние в "офсетном файле"; для каждого файла, в котором вы его запускаете, он будет хранить номер последней строки, а также текст, который был в этом номере строки.
В следующий раз, когда вы запустите программу, она попытается найти сохраненный номер строки и сравнить содержимое. Если есть совпадение, будет выведена остальная часть файла, начиная со следующей строки. Если в файле на диске меньше строк или содержимое строк не совпадает, предполагается, что файл был очищен или повернут, и в этом случае он начнется с первой строки.
Наконец, розничная торговля обновит сохраненный номер строки и содержимое.
Программное обеспечение находится по адресу:http://xjack.org/retail/
Когда я запускаю розничную торговлю с правами root, мне нравится помещать сохраненное состояние в /var/lib/retail. Например, на одной машине я запускаю ритейл каждый час, чтобы составить отчет о входах в систему SSH, используя сценарий, содержащий следующую командную строку:
/usr/local/bin/retail -p /var/lib/retail/ /var/log/secure >"$tempfile"
Удачи!