1 (изменено: wuratew, 2015-10-30 17:20:43)

Тема: Помогите уменьшить bash скрипт.

Добрый день. Помогите уменьшить bash скрипт.
Задача скрипта: Мониторить процесс, в случае его отсутствия запускать скрипт и выполнять команду по запуску. Если процесс присутствует, то ничего не запускать.
Программа запуска с параметрами выглядит так: /home/temp/programma /home/temp/sys01.txt
1. /home/temp/programma  в единственном экземпляре
2. /home/temp/sys01.txt  много текстовых файлов. различие только в цифрах имени файла.

Пример: В процессах висит команда /home/temp/programma /home/temp/sys02.txt, скрипт запускается по крону и проверяет, если есть, то закончить работу не запуская команду /home/temp/programma /home/temp/sys02.txt.
А также втотже момент проверки процесса отсутствует например /home/temp/programma /home/temp/sys15.txt, то он запускается команду /home/temp/programma /home/temp/sys15.txt, для того чтобы процесс появился.

Что на данный момент есть.


#!/bin/bash

NUM=`/bin/pidof -o $$ -o $PPID -o %PPID -x /home/temp/programma |pgrep -f sys01|wc -w`
NUM=`/bin/pidof -o $$ -o $PPID -o %PPID -x /home/temp/programma |pgrep -f sys02|wc -w`
тут и далее много таких строк
NUM=`/bin/pidof -o $$ -o $PPID -o %PPID -x /home/temp/programma |pgrep -f sys50|wc -w`

if [ $NUM -lt 0 ]
then
exit
else
/home/temp/script.sh  //в этом скрипте перечислены команды запуска , чуть ниже его код

fi
NUM=`/bin/pidof -o $$ -o $PPID -o %PPID -x /home/temp/programma |pgrep -f sys01|wc -w`
NUM=`/bin/pidof -o $$ -o $PPID -o %PPID -x /home/temp/programma |pgrep -f sys02|wc -w`
тут и далее много таких строк
NUM=`/bin/pidof -o $$ -o $PPID -o %PPID -x /home/temp/programma |pgrep -f sys50|wc -w`

if [ $NUM -lt 0 ]
then
exit
fi
exit 0 # прекращаем выполнение скрипта

Скрипт script.sh


/home/temp/programma /home/temp/sys01.txt
/home/temp/programma /home/temp/sys02.txt
/home/temp/programma /home/temp/sys03.txt
тут и далее меняются только цифры в имени файла
/home/temp/programma /home/temp/sys50.txt

уф... увы, я не могу уменьшить скрипт (незнаю как правильно), будьте добры, помогите его уменьшить переменными или как ли ещё.

2

Re: Помогите уменьшить bash скрипт.

Я правильно понял задачу:

1. не запускать program filename_01 если filename_01 уже в процессе обработки
2. немедленно запустить program filename_01, если этот файл не обрабатывается.
3. внешний скрипт script может запустить сразу несколько экземпляров программы program для разных файлов filename_nn

( 2 * b ) || ! ( 2 * b )

3 (изменено: wuratew, 2015-10-30 23:03:08)

Re: Помогите уменьшить bash скрипт.

1. да, так как уже запущена одна копия и вторая ненужна
2. да, так как процесс с командой отсутствует в запущенных процессах
3. да, конечно, можно запускать сразу filename01 и filename05 и так далее, если они отсутствуют в процессах.

ЗЫ. Все команды запуска перечислены в файле script.sh
То есть, там может и не быть строчки например с цифрами 06, или 02

/home/temp/programma /home/temp/sys01.txt
/home/temp/programma /home/temp/sys02.txt
/home/temp/programma /home/temp/sys03.txt
/home/temp/programma /home/temp/sys04.txt
/home/temp/programma /home/temp/sys05.txt
/home/temp/programma /home/temp/sys06.txt
тут и далее меняются только цифры в имени файла
/home/temp/programma /home/temp/sys50.txt

Ну как бы , допустим команда на выполнение сегодня нужна, а через неделю допустим нет.
Как пример закоментировать её или удалить. и чтобы она не выполнялась

4

Re: Помогите уменьшить bash скрипт.

Попробуйте. Перед публикацией я проверил только на команде sleep с разными задержками в пределах 15 секунд.


#!/bin/bash

basedir="${0%/*}"

progname="$basedir/programma"

invoke() {
	num="$(
		pidof -o $$ -o $PPID -o %PPID -x "$progname" \
		| pgrep -f "$1" \
		| wc -w
	)"

	[ "$num" -eq 0 ] || return

	"$progname" "$1" &
}

for f in "$basedir"/sys[0-9][0-9].txt
do
	invoke "$f"
done
( 2 * b ) || ! ( 2 * b )

5 (изменено: wuratew, 2015-10-30 23:57:09)

Re: Помогите уменьшить bash скрипт.

Rumata ВАУ, как компактно выглядит, и совсем не так как у меня, класс. Завтра проверю, обесчаю и отпишусь. Ещё вопрос, а если 3 ряд цифр появится то, то строка

for f in "$basedir"/sys[0-9][0-9].txt

, должна будет выглядеть так?

for f in "$basedir"/sys[0-9][0-9][0-9].txt

Ого, похоже что мне можно будет избавится от скрипта script.sh

6 (изменено: wuratew, 2015-10-31 12:44:41)

Re: Помогите уменьшить bash скрипт.

wuratew
проверил, работает. Подскажите такой момент, я сообщение выше написал, если появится третий ряд цифр (тоесть теже самые тхт файлы, но с цифрами например 105,109), то как эта строка должна будет выглядеть?
Или например теже файлы но с одной цифрой, например: sys1.txt, sys8.txt?
И ещё вопрос, в под папках скрипт не будет искать похожие файлы?
А так очень здорово, я бы сказал великолепно, то что нужно, офигенно упростили его. Большая благодарность.

То есть имя файлы sysXXXX.txt
А под XXXX может быть любая цифра, (от 1 до 9999), и не обязательно по порядку, в разнобой.

7 (изменено: wuratew, 2015-10-31 13:29:29)

Re: Помогите уменьшить bash скрипт.

Rumata всё получилось, спасибо Вам огромное. Вставил между скобками снежинку.
Вот так

for f in "$basedir"/sys[0-9]*[0-9].txt

Так как если ещё один ряд добавлять, то он исчет 3х значный файл, если 2 пары скобок, то 2х значный.
Осталось разобраться, как сделать чтобы искал и одно число в имени и если вдруг 4 значные будут в имени файла.

8

Re: Помогите уменьшить bash скрипт.

sys[0-9][0-9].txt

все файлы вида sys01.txt, sys02.txt, ... sys99.txt.

sys[0-9][0-9][0-9].txt

все файлы вида sys001.txt, sys002.txt, ... sys999.txt.

sys[0-9]*[0-9].txt

все файлы вида sys01.txt, sys001.txt, sys0любое-количество-любых-символов1.txt и так далее для всех комбинаций цифр в указанных позициях.

Во всех выше приведенных случаях поиск ведется только в заданном каталоге. Поиск в глуину не производится.

Если Вам надо обработать все файлы вида sysX.txt, где X соответствует любому количеству цифр используйте комбинацию find "$basedir" -maxdepth 1 -name 'sys*.txt'. Используя фильтры grep/sed/awk/perl можете добиться искомого результата.

( 2 * b ) || ! ( 2 * b )