У меня есть скрипт perl, который эмулирует команду tee, поэтому я могу получить вывод, записанный на терминал и файл журнала. Он работает примерно так (ошибка проверки & c опущена).perl родительский процесс зависает, ожидая, пока дочерний процесс будет читать stdin
$pid = open(STDOUT, '-|');
# Above is perl magic that forks a process and sets up a pipe with the
# child's STDIN being one end of the pipe and the parent's STDOUT (in
# this case) being the other.
if ($pid == 0)
{
# Child.
# Open log file
while (<STDIN>)
{
# print to STDOUT and log file
}
#close log files
exit;
}
# parent
open STDERR, '>&STDOUT';
# do lots of system("...") calls
close STDERR;
close STDOUT;
exit;
Это иногда висит, и всегда, если вы посмотрите на процессы и стеки указанных процессов, родитель висит в одном из закрытий, ожидая ребенка, чтобы выйти, в то время как ребенок висит читать что-то из файла (который должен быть STDIN, потому что другого файла нет).
Я скорее затрудняюсь с тем, как с этим бороться. Проблема возникает, если вы запускаете программу из оболочки, которая не подключена к консоли. Работа скрипта в нормальной оболочке работает нормально, и единственный фрагмент кода, который недавно изменился в этом скрипте, - это добавление открывать/закрывать файл, чтобы просто коснуться его (и до того, как скрипт доберется до этого кода «tee»).
У кого-нибудь были проблемы, подобные этому раньше, и/или есть предложение относительно того, что я могу сделать, чтобы исправить это? Благодарю.
Выполняется ли это при удалении? STDOUT перенаправляется раньше - в командной строке cron-ed или в программе? – zdim
Я не вижу проблемы, для меня это работает в любом случае. Я обновил свой пост с конкретными вещами, которые я пробовал, и с точным кодом, который я использую. Я думаю, что буферизация/STDIN запуталась. Например, последние отпечатки (последний буфер) не очищаются. – zdim