2016-09-30 3 views
-1

Я тренировался с помощью скриптов bash и написал этот небольшой скрипт, который должен был печатать все доступные для чтения файлы размером более 1 ГБ.Bash script loops бесконечно

#! /bin/bash 
find/-size +1G -readable 

Когда я запускаю его таким образом, он, очевидно, начинает печатать тонны вещей. Я не смог завершить или прервать процесс, используя Ctrl + C/Ctrl + Z. Позже я добавил & в конце скрипта, но он все равно не будет работать в фоновом режиме.

У кого-нибудь есть идея, почему это происходит?

+0

Любая вероятность того, что процесс поиска был в невосполнимом сне? Если это проверка linux 'ps aux' и посмотреть, находится ли она в состоянии D. Это может произойти, например, если у вас есть монтирование NFS, но сервер недоступен. – FatalError

+0

Я запускаю linux на ssh и графическом интерфейсе, и я даже не мог получить доступ к таблице ps во время работы скрипта. Придется закрыть программу и снова подключиться. Сам сценарий выглядит правильно? – DR29

+0

Откройте вторую сессию для проверки. Ничто в вашем скрипте не должно зависеть от обычных условий. – FatalError

ответ

1

Печать на терминал требует времени. Когда программа печатается быстрее, чем bash может не отставать, нажатие CTRL + C не поможет, потому что весь вывод уже добавлен в конвейер. Вы можете остановить find на полпути, но так как у него уже было столько хитов, bash продолжает печатать то, что находится в стадии разработки, даже если вы убили процесс.

Добавление & не поможет ни потому, что сеанс терминала все еще подкрепляется IO. Просто запустите процесс в фоновом режиме, не означает, что bash не собирается печатать IO.

Вот простой сценарий bash. Запустите это с помощью &, и вы все равно увидите распечатку 1s.

while [[ 1 -eq 1 ]] 
do 
    echo 1; sleep 1; 
done 

Главное, чтобы попробовать перенаправить IO в файлы.

find -------- 2> /dev/null 

Это устраняет ошибки «Разрешения на отказ» в/dev/null. Если вы запускаете этот скрипт как обычный пользователь, вы, вероятно, получаете много таких ошибок.

find ---------- 1> find.txt 

Это поместит положительные хиты в find.txt, так что вы можете вернуться и занять свое время, читая положительные хиты. И вместе,

find ---------- 2> /dev/null 1> find.txt