Вы пропускаете некоторые двойные кавычки (всегда помещаемые двойные кавычки вокруг подстановок переменных $foo
и замены команды $(foo)
, если Вы не знаете, почему Вы можете безопасно оставить их и должны оставить их). Но это не вся проблема.
if [ ! -d $START ]
должен быть if [ ! -d "$START" ]
.
DIRS=$(find "$START" -type d)
На данном этапе DIRS
содержит название каталога запуска и его подкаталогов рекурсивно, с промежуточными новыми строками. Таким образом, если у Вас есть какое-либо имя каталога, которое содержит новую строку, Вы проиграли: невозможно знать, какие новые строки прибыли из имени каталога и которые были разделителями. Если Вы знаете, что нет никаких новых строк в именах файлов, можно проанализировать вывод find
, но как Вы знали бы?
Между прочим, нормально не иметь двойные кавычки вокруг $(…)
здесь, потому что это - переменные присвоения, и замены в присвоениях неявно защищены. Однако отметьте это так же не защищен. Лучше всего для использования кавычек, если Вы не бегло говорите на сценариях оболочки и так являетесь всеми людьми, которые поддержат Ваш сценарий.export DIRS=$(…)
for d in $DIRS
Это - то, где Вы проигрываете: Вы хотите разделить $DIRS
в слова, таким образом, Вы не можете поместить двойные кавычки, но Вам нужны двойные кавычки потому что $DIRS
имеет все элементы, связанные вместе, и имена файлов в пробелах были бы разделителями при отъезде их, закрыл кавычки.
Обычно, когда Вы используете find
, необходимо заставить его вызвать команду обработки, с -exec
опция. Если у Вас нет трудных средств управления на именах файлов, не анализируйте вывод find
: это неоднозначно.
find "$START" -type d -exec sh -c '
echo "$0 directory has $(find "$0" -maxdepth 1 -regex ".*\\." -type f -printf \\n | wc -l) files whose name ends with ."
' {} \;
Отметьте снова во встроенном find
управляйте этим при парсинге вывода find
, Ваше количество будет выключено, если какое-либо имя файла будет содержать новую строку.
Я думаю, что Вы могли попробовать следующее:
$ kill -6 1
Это отправляет сигнал № 6 обработать № 1 (процесс init). Если Вы читаете в странице справочника сигналов: "человек 7 сигналов":
Signal Value Action Comment
-------------------------------------------------------------------------
SIGHUP 1 Term Hangup detected on controlling terminal
or death of controlling process
SIGINT 2 Term Interrupt from keyboard
SIGQUIT 3 Core Quit from keyboard
SIGILL 4 Core Illegal Instruction
SIGABRT 6 Core Abort signal from abort(3)
Можно узнать, как процесс хочет обработать различные сигналы (cat /proc/$PID/status
). Посмотрите это Вопросы и ответы U&L для большего количества информации: Как я могу проверить то, что сигнализирует, что процесс слушает?.
Другой метод должен переполнить памяти для стимулирования паники ядра. Сначала необходимо будет отключить подкачку.
$ swapon -s
Filename Type Size Used Priority
/dev/mapper/VolGroup00-LogVol01 partition 14352376 3177812 -1
$ swapoff /dev/mapper/VolGroup00-LogVol01
Теперь использовать всю память:
$ for r in /dev/ram*; do cat /dev/zero > $r; done
Некоторые аппаратные средства Intel имеют кнопку NMI (Немаскируемое прерывание), которое сразу вызовет панику, если Вам включат сторожевой таймер NMI. Существует пара других способов заставить сторожевой таймер NMI паниковать также
Можно попробовать sudo kill -SEGV 1
. Это сразу разрушит init, как будто был отказ MM (ядро, эквивалентное из нарушения сегмента).
/proc/sysrq-trigger
. Я предполагаю, что необходимо быть в tty для наблюдения информации об ошибке. И для цикла, который использует всю память,cat
получает ошибку при записи, говоря, что устройство полно, но ядро должно заботиться о нем, becuase, если я проверяю, что моя RAM, только ~300MB используется. – tkbx 02.08.2013, 21:54