У меня есть много кода, который мне нужно демонизировать, который выводит на печать в стандарте. Я подумываю использовать следующий сценарий оболочки для создания именованного канала, чтобы я мог не запускать процесс, перенаправляя его вывод в канал.
#!/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
); и откажитесь от своего решения с именованным каналом.