Неустойчивое количество файлов и каталогов [закрыто]

export kibana_exec="nohup /data/kibana-main/bin/kibana > /data/logs/kibana/kibana.log 2>&1 "
if [ ! -f $kibana_exec ]; then

Это похоже на то, что приведет к ошибке [: слишком много аргументов: $kibana_exec расширяется до нескольких слов (пять, в заданном значении выше), которые не образуют осмысленного теста, поэтому [ выдает ошибку. Это не имеет особого смысла даже с [ ! -f "$kibana_exec" , поскольку значение в переменной также не похоже на имя файла. Кроме того, если вы хотите использовать подстановку команд для запуска программы и захвата того, что она напечатает, вы должны использовать kibana_exec=$(command ...), но здесь это тоже не сработает, так как вы перенаправляете весь вывод в лог-файл.

Однако я не могу сопоставить номер строки (39) в сообщении об ошибке со сценарием. Насколько я могу судить, строка 39 — это export pid=$PIDFILE, который, похоже, не должен выдавать ошибку.

Я не совсем уверен, что вы пытаетесь здесь сделать, должен ли kibana_exec содержать только имя исполняемого файла (/data/kibana-main/bin/kibana)? И если это так, возможно, вам следует использовать [-x "$kibana_exec"].


В функции stop() kibana_exec выглядит неустановленным, поэтому [ ! -f $kibana_exec ] будет просто [ ! -f ] проверяет, пусто ли -f. Это не так, поэтому условная часть никогда не выполняется.

export PIDFILE="`(ps -eaf | grep kibana | awk '{print $2}')`"
export pid=$PIDFILE

Здесь grep, вероятно, соответствует нескольким строкам в выводе ps, а именно kibana и самому grep, поэтому окончательный вывод имеет два PID в две строки. Для них устанавливается pid, и когда вы запускаете su -c "... $pid", оболочка, запущенная su, видит две строки с второй только со вторым PID. Он пытается запустить это как команду, но не находит, и вы получаете что-то вроде 8197: команда не найдена. строка 1, упомянутая в сообщении об ошибке, очевидно, не является первой строкой полного скрипта, так что это также работает как подсказка, что она из другой оболочки, созданной внутри скрипта.

Что-то вроде pid=$(pgrep kibana) может быть лучше (pgrep не будет соответствовать самому себе) или pid=$(pgrep -d' ' kibana ), чтобы разделить пространство PID, на случай, если их больше одного (так что su -c "kill $pid" убьет их всех).

0
22.05.2017, 09:49
2 ответа

Работающая система Unix будет время от времени создавать временные файлы и каталоги во время нормальной работы.

Простое открытие файла в редакторе или отправка электронного письма могут привести к созданию одного или двух временных файлов, а просмотр веб-страниц может создать и удалить сотни файлов за короткий промежуток времени. Кроме того, графическая среда рабочего стола может выполнять кэширование и другие вещи, которые вы обычно не замечаете, создавая и удаляя временные файлы.

В зависимости от того, какой у вас главный каталог, вы вполне можете охватить каталоги, которые имеют тенденцию сильно меняться, например /tmp и все каталоги в /var, и ваш домашний каталог.

2
28.01.2020, 02:25

dirs — это список имен каталогов в текущем (корневом) каталоге, а files — это список имен файлов в текущем каталоге.

Я думаю, вам нужно что-то вроде этого:

def traverse(top):
    filecount = 0
    dircount = 0
    for root, dirs, files in os.walk(top):
        dircount += len(dirs)
        filecount += len(files)
    print("Num of dir: " + dircount)
    print("Num of files: " + filecount)
1
28.01.2020, 02:25

Теги

Похожие вопросы