2011-01-24 5 views
0

Я использовал эту программу командной строки, которую я нашел в another post on SO, описывая, как паук веб-сайта.Как данные обрабатываются по трубам?

wget --spider --force-html -r -l2 http://example.com 2>&1 | grep '^--' | awk '{ print $3 }' | grep -v '\.\(css\|js\|png\|gif\|jpg\)$' > wget.out 

Когда я выползаю большой сайт, это занимает много времени, чтобы закончить. Между тем файл wget.out на диске показывает нулевой размер. Итак, когда обрабатываемые данные передаются и записываются в файл на диске? Является ли это после того, как каждый этап в трубе заканчивается? В этом случае wget.out будет заполнен после завершения всего сканирования.

Как заставить программу записывать с перерывами на диск, чтобы, даже если этап сканирования был прерван, у меня есть какой-то вывод?

+1

Возможный дубликат [Отключить буферизацию в трубе] (http://stackoverflow.com/questions/1000674/turn-off-buffering-in-pipe) – eumiro

ответ

1

Буферизация в каждой трубе и, возможно, в уровнях stdio каждой программы. Данные не будут поступать на диск до тех пор, пока окончательный grep не обработает достаточно строк, чтобы его буферы заполнились до того, что они были разлиты на диск.

Если запустить конвейер в командной строке, а затем нажмите Ctrl - C, sigint будет отправлен каждому процессу, завершение каждого, и потери в ожидании выхода.

Либо:

  1. Игнорирование во всех процессах, но первый sigint. Bash повозка, запряженная волами следующим образом:

    $ wget --spider --force-html -r -l2 http://example.com 2>&1 grep '^--' | 
        { trap '' int; awk '{ print $3 }'; } | 
        ∶ 
    
  2. Просто доставить клавиатуры прерывания первого процесса. Взаимодействующе вы можете обнаружить pid с jobs -l, а затем kill что. (Запуск трубопровода в фоновом режиме.)

     
    $ jobs -l 
    [1]+ 10864 Running   wget 
        3364 Running    | grep 
        13500 Running    | awk 
    ∶ 
    $ kill -int 10864 
    
  3. Поиграйте с disown Баш встроенных команд.

Смежные вопросы