Sidebar

Нужна помочь со скриптом под Linux

XaeroX

Crystice Softworks
VIP
05.09.08
9 215
38
  • Бронзовая медаль 212
  • Золотая медаль 325
  • Золотая медаль 214
  • Золотая медаль 233
  • Золотая медаль 221
Нужна помощь со скриптом под Linux

Уважаемые господа линуксоиды, нужно срочно написать шел-скрипт. Просьба помочь...
Алгоритм скрипта такой:

- вызов программы А с аргументом, являющимся аргументом данного скрипта.
- ожидание завершения программы А.
- после завершения программы А - поиск всех файлов по определенной маске (ну, допустим, fuck*.me) в текущей директории, и для каждого найденного файла:
-- создание шел-скрипта, который вызывает программу А с аргументом, являющимся именем найденного файла. Разумеется, этот скрипт должен быть исполняемым.
-- запуск программы Б с аргументом-именем вышесозданного скрипта.
-- не дожидаемся завершения Б (!) и продолжаем цикл.
- ну и какое-нибудь сообщение, типа "Йа кончел".

Если такое невозможно реализовать на скриптах, просьба объяснить, почему. В таком случае придется на плюсах эту утилитку писать...
 
Останнє редагування:

TwisteR

VIP
VIP
24.07.06
4 045
  • Серебряная медаль 311
  • Золотая медаль 115
  • Серебряная медаль 215
XaeroX сказав(ла):
-- создание шел-скрипта, который вызывает программу А с аргументом, являющимся именем найденного файла. Разумеется, этот скрипт должен быть исполняемым.
-- запуск программы Б с аргументом-именем вышесозданного скрипта.
-- не дожидаемся завершения Б (!) и продолжаем цикл.
Вот тут моск закипел %) Зачем плодить множество одинаковых скриптов?

Может давай лучше ты опишешь задачу, а алгоритм я разработаю сам?

Вот что вырисовывается для первых трёх пунктов:
Код:
#!/bin/bash

CMD=sleep
MASK="fuck*.me"

$CMD $*

if test $? -ne 0; then
        echo "Command \"$CMD\" exited with non-zero status (an error occured). Terminating.";
        exit 1;
fi

for i in `find -type f -name "$MASK"`
do
        if [ -f $i ]; then
                echo "File: $i"
        fi
done
 

XaeroX

Crystice Softworks
VIP
05.09.08
9 215
38
  • Бронзовая медаль 212
  • Золотая медаль 325
  • Золотая медаль 214
  • Золотая медаль 233
  • Золотая медаль 221
Зачем плодить множество одинаковых скриптов?
Как зачем? Чтобы запускать их на кластере :)
Сначала мы запускаем прогу по-бырому и получаем пачку снапов, а потом для каждого снапа ждать завершения работы программы уже не надо. Хотя, кстати, можно и ждать - программа запуска лишь ставит скрипты на очередь в кластер и тут же возвращается.
За код спасибо, хотелось бы еще понять, как создать исполняемый скрипт средствами баша и вписать в него нужные команды.
 
Останнє редагування:

TwisteR

VIP
VIP
24.07.06
4 045
  • Серебряная медаль 311
  • Золотая медаль 115
  • Серебряная медаль 215
2 XaeroX:
Очень просто. Если предположим, что под руками имеется консольный редактор nano, то выглядит всё это так:
Код:
# Опция -w отключает автоматическую расстановку переносов

$ nano -w script.sh

# вставляем скрипт из буфера обмена, для чего нажимаем на колёсико мышки
# затем записываем на диск нажатием ctrl+o, enter и выходим ctrl+x
# далее — делаем файл исполняемым

$ chmod +x script.sh

# и запускаем

$ ./script.sh
Если nano нету, его можно поставить из менеджера пакетов или использовать любой другой установленный в системе (mcedit в составе mc, vim, emacs и т.п.).
 

XaeroX

Crystice Softworks
VIP
05.09.08
9 215
38
  • Бронзовая медаль 212
  • Золотая медаль 325
  • Золотая медаль 214
  • Золотая медаль 233
  • Золотая медаль 221
Эээ... Мне надо автоматизированно все делать. Единственное, что делает юзер - вбивает в консольке имя исходного скрипта с нужным параметром.
 

TwisteR

VIP
VIP
24.07.06
4 045
  • Серебряная медаль 311
  • Золотая медаль 115
  • Серебряная медаль 215
2 XaeroX:
А, тьфу, не верно понял твой предыдущий пост. Для записи строк в файл удобно использовать перенаправление потока:
Код:
# Перенаправление с помощью > создаёт новый или перезаписывает
# существующий файл, а >> — создаёт новый или дописывает в конец
# существующего файла

$ echo "#!/bin/bash" > somefile.sh
$ echo "CMD=sleep" >> somefile.sh
$ echo "$CMD $*" >> somefile.sh

$ chmod +x somefile.sh
Разумеется, это всё (строки будущего файла) можно упаковать в одну строку, разбитую символами переноса \n (тогда команде echo нужно указать ключ -e, чтоб она интерпретировала спец-символы). Так же нужно следить за кавычками и корректно их отменять (\"), если они встречаются в строке, которую нужно записать в файл.

Если же генерируемый скрипт содержит много строк, то рациональнее использовать шаблонный файл. Исправления в него удобно вносить с помощью потокового редактора sed, используя регулярные выражения для замены подстрок.
 

XaeroX

Crystice Softworks
VIP
05.09.08
9 215
38
  • Бронзовая медаль 212
  • Золотая медаль 325
  • Золотая медаль 214
  • Золотая медаль 233
  • Золотая медаль 221
2 TwisteR:
Огромное спасибо! Приятно осознавать, что на форуме есть знающие люди, к кому можно обратиться и получить ответ быстро и по делу.
 

XaeroX

Crystice Softworks
VIP
05.09.08
9 215
38
  • Бронзовая медаль 212
  • Золотая медаль 325
  • Золотая медаль 214
  • Золотая медаль 233
  • Золотая медаль 221
Ну что сказать... ничего не работает. Любые условные операторы и циклы приводят к unexpected end of file. Вот скрипт. Если закоменитить в нем и if, и for, все работает. Если чтото раскоментить из них - нихрена.
Помимо циклов, там у меня еще много закомментированного. Уж не знаю, правильно ли, но хотя бы просто условие и цикл заставить работать хочется... :(

Код:
#!/bin/bash
#
LOCDIR=$PWD
#
CMD=/home/prog
MASK="*.molMdRes*.pdb"
#
echo "---------------------------"
echo "Starting quick modelling..."
echo "---------------------------"
#
$CMD -i $LOCDIR/$*_quick.inp -mn $* -c $LOCDIR/$*.pdb -o $LOCDIR/$*.out
#
if test $? -ne 0; then 
	echo "Command exited with non-zero status (an error occured). Terminating."; 
	exit 1; 
fi
#
echo "---------------------------"
echo "Quick modelling complete."
echo "Starting detailed modellings..."
echo "---------------------------"
#
for i in `find -type f -name "$MASK"`; do 
        if [ -f $i ]; then
#		mkdir $LOCDIR/$i.dir
#		echo "#/bin/sh" > $LOCDIR/$i.dir/$i.sh
#		echo "date" >> $LOCDIR/$i.dir/$i.sh
#		echo "$CMD -i $LOCDIR/$*.inp -c $i -o $LOCDIR/$i.dir/$i.out" >> $LOCDIR/$i.dir/$i.sh
#		echo "date" >> $LOCDIR/$i.dir/$i.sh
#		chmod +x $LOCDIR/$i.dir/$i.sh
		echo "Submitting script: $i.dir/$i.sh"
#                qsub -V $LOCDIR/$i.dir/$i.sh
        fi
done
#
echo "---------------------------"
echo "All scripts submitted."
echo "---------------------------"
 

TwisteR

VIP
VIP
24.07.06
4 045
  • Серебряная медаль 311
  • Золотая медаль 115
  • Серебряная медаль 215
Код:
twister@tfsoft-3 ~/tmp/xaerox $ ./script2.sh
---------------------------
Starting quick modelling...
---------------------------
---------------------------
Quick modelling complete.
Starting detailed modellings...
---------------------------
Submitting script: ./fon.txt.dir/./fon.txt.sh
Submitting script: ./parameter.txt.txt.dir/./parameter.txt.txt.sh
Submitting script: ./am241.txt.txt.dir/./am241.txt.txt.sh
Submitting script: ./cs137.txt.txt.dir/./cs137.txt.txt.sh
---------------------------
All scripts submitted.
---------------------------

twister@tfsoft-3 ~/tmp/xaerox $ ls -l *.dir*
am241.txt.txt.dir:
-rwxr-xr-x 1 twister twister 145 Окт 26 12:33 am241.txt.txt.sh

cs137.txt.txt.dir:
-rwxr-xr-x 1 twister twister 145 Окт 26 12:33 cs137.txt.txt.sh

fon.txt.dir:
-rwxr-xr-x 1 twister twister 127 Окт 26 12:33 fon.txt.sh

parameter.txt.txt.dir:
-rwxr-xr-x 1 twister twister 157 Окт 26 12:33 parameter.txt.txt.sh
Твой скрипт у меня вполне корректно отработал. Создал каталоги, в каждом — по скрипту такого вида:
Код:
#/bin/sh
date
sleep -i /home/twister/tmp/xaerox/.inp -c ./am241.txt.txt -o /home/twister/tmp/xaerox/./am241.txt.txt.dir/./am241.txt.txt.out
date
Всё, что я сделал — заменил команду на sleep, маску на *.txt и раскоментил тело цикла. Может быть проблема не в скрипте? Или в строках, которые я заменил. Попробуй отдельные мини-скрипты создать, которые бы соредержали эти строки и на них потестировать. Кстати, кто докладывает о неожиданном конце файла? Bash?
 

XaeroX

Crystice Softworks
VIP
05.09.08
9 215
38
  • Бронзовая медаль 212
  • Золотая медаль 325
  • Золотая медаль 214
  • Золотая медаль 233
  • Золотая медаль 221
Да, баш.
А если написать скажем
echo "foo";
то он выводит:
foo
: unknown command
убираю точку с запятой - все ок.
Может, интерпретатор у них на кластере шальной? :(
 

TwisteR

VIP
VIP
24.07.06
4 045
  • Серебряная медаль 311
  • Золотая медаль 115
  • Серебряная медаль 215
Хм, странно. Узнай версию:

Код:
twister@tfsoft-3 ~/tmp/xaerox $ echo "foo";
foo
twister@tfsoft-3 ~/tmp/xaerox $ bash --version
GNU bash, version 4.0.28(2)-release (i686-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
 

XaeroX

Crystice Softworks
VIP
05.09.08
9 215
38
  • Бронзовая медаль 212
  • Золотая медаль 325
  • Золотая медаль 214
  • Золотая медаль 233
  • Золотая медаль 221
Да, забыл сказать - из командной строки все работает, включая if. Проблемы начинаются, когда я их в скрипт закидываю.
 

TwisteR

VIP
VIP
24.07.06
4 045
  • Серебряная медаль 311
  • Золотая медаль 115
  • Серебряная медаль 215
Код:
twister@tfsoft-3 ~/tmp/xaerox $ echo "echo \"foo\";" > test
twister@tfsoft-3 ~/tmp/xaerox $ chmod +x test
twister@tfsoft-3 ~/tmp/xaerox $ ./test
foo
Нужна версия, посмотри плз.
 

XaeroX

Crystice Softworks
VIP
05.09.08
9 215
38
  • Бронзовая медаль 212
  • Золотая медаль 325
  • Золотая медаль 214
  • Золотая медаль 233
  • Золотая медаль 221
Окей, завтра посмотрю. Сегодня я уже дома, а доступ к кластеру есть только из рабочей подсетки.
 

XaeroX

Crystice Softworks
VIP
05.09.08
9 215
38
  • Бронзовая медаль 212
  • Золотая медаль 325
  • Золотая медаль 214
  • Золотая медаль 233
  • Золотая медаль 221
Код:
GNU bash, version 3.00.15(1)-release (ia64-redhat-linux-gnu)
Copyright (C) 2004 Free Software Foundation, Inc.
Post automatically merged:

Так, проблема решилась. Я идиот, убейте меня кто-нибудь.

Post automatically merged:

Но есть еще вопросы.

Как из имени файла вида "./test.ext" получить "test"? В баше есть для этого какие-то билтины типа ExtractFileName?

Post automatically merged:

Гугл спас отца русской демократии :)
 
Останнє редагування:

Game Server

Доноры Красавчики

Користувачі онлайн