Назад | Перейти на главную страницу

ведение журнала с именованными каналами

У меня есть много кода, который мне нужно демонизировать, который выводит на печать в стандарте. Я подумываю использовать следующий сценарий оболочки для создания именованного канала, чтобы я мог не запускать процесс, перенаправляя его вывод в канал.

#!/bin/bash

###############3
# creates a pipe with name pipename that will redirect to filename and rotate logs on C-c
###############3

if [ $# -ne 2 ]; then
    echo "USAGE: ./$0 pipename filename" 
    exit -1
fi

pipename=$1; 
if [ -p $pipename ]; then
    rm $pipename;
fi
origname=$2.log
filename=$2

rename()
{
    newfilename="$origname-`date +%s`"
    mv $origname $newfilename
    nohup nice -n 20 tar -czvf $newfilename.tar.gz $newfilename &
    trap rename 2
}

mkfifo $pipename
trap rename 2

while [ 1 -eq 1 ]
do
    read input
    echo $input >> $origname
done  $pipename

Тогда я мог бы запустить процесс следующим образом:

nohup myprog.py > namedpipe 2>&1 &

После запуска я бы настроил задание cron, чтобы отправить ему сигнал для ротации.

Насколько надежен / эффективен этот сценарий?

Нет.

Если namedpipe уже существует, напечатайте предупреждение и остановите его, а не просто удалите: что происходит со скриптом, который его использовал? Посмотрите на существующие скрипты в /etc/init.d. Посмотрите на start-stop-daemon в Debian и Ubuntu (или в любом дистрибутиве, производном от Debian).

Сообщения об ошибках должны поступать на stderr, а не на stdout. В конце отсутствует перенаправление ввода. Tar добавляет ненужные накладные расходы: просто заархивируйте файл.

И так далее.

Но в любом случае все это не нужно для добавления ротации логов в скрипты, запускаемые с nohup: просто используйте copytruncate вариант в logrotate (видеть man logrotate); и откажитесь от своего решения с именованным каналом.