LINUX.ORG.RU

Bash скрипт нужна помощь

 ,


0

1

Нужно написать скрипт так, чтобы он записывал в файл новую строку, только, если количество запущенных процессов в системе изменилось.

Пробовал с использованием переменных

#!/bin/bash
a=0
b=0
ps -A | wc -l > tmp #узнаем кол-во запущенных процессов, сразу считаем строки и записываем в файл
cat tmp > $a
if [$a -ne $b]; then
cat $a > $b
cat $b >> result2
fi

Но почему то выдает ошибку на строке с «if» -0: команда не найдена.

Не могу понять в чем дело, уже кучу вариантов перепробовал.

if [ $a -ne $b ]; then
E ★★★
()

а если так?

if [ $a -ne $b ]; then

surefire ★★★
()

if [ «$a» -ne «$b» ]; then

Пробелы критичны.

AnDoR ★★★★★
()

Но тут и кроме это ошибки вообще ничего работать не будет.. Работает твоя программа примерно так. Содержимое файла «tmp» записывается в файл «0» 0 сравнивается с 0, они равны и программа завершается. Если бы 0 был не равен 0, то было бы дальше: Содержимое файла «0» записывается в файл «0» Содержимое файла «0» записывается в файл «result2»

surefire ★★★
()

Это дзен-скрипт, который переливает из пустого в порожнее.

anonymous
()

cat tmp > $a

у тебя будет создан файл с именем 0, и в него запишется содержимое tmp.
надо как-то так.
a=`<tmp`

bl ★★★
()

Ты, видимо, хотел написать что-то такое.

#!/bin/bash

prev_result=$(cat tmp)
curr_result=$(ps -A | wc -l)
echo $curr_result > tmp

if [[ $curr_result != $prev_result ]]; then
    echo "" >> result
fi

mathcrosp ★★
()

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

вижу решение только в виде демона (не на bash который сам будет запускать новые процессы)

quest ★★★★
()
Последнее исправление: quest (всего исправлений: 1)

Тут уже говорили, что файл читать надо так: read VAR < filename

Сравнивать числа нужно так: if (( $A == $B ))

emulek
()

спасибо, потренировался на perl:

#!/usr/bin/perl

sub proc {
 open (FD, "ps -ax --no-headers|");
 $num=0;
 while(<FD>){$num++};
 close (FD);
 return $num
}
$cur = proc();
while (1) {
 $last=proc();
 if ($last==$cur){
  sleep 2;
 } else {
 $cur = $last};
 print "$last\n";
}

anonymous
()
Ответ на: комментарий от greenplastik
prev_result=$(cat -- tmp)
curr_result=$(ps -A -o pid)
printf "%s" "${curr_result}" > tmp

if [ "${curr_result}" != "${prev_result}" ]
then
    printf "\n" >> result
fi
greenplastik
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.