Запуск скриптов c из сценария оболочки

У меня есть этот сценарий оболочки

#!/bin/csh
@ x = 1
while ($x <= 2)
nohup ./prog1 && ./prog2 &
@ x ++
end

Я хочу запустить последовательно 2 раза программы prog1 и prog2, которые ранее были скомпилированы через make-файл. Как мне это сделать? Сценарий правильный?

If I do

chmod u+x test.csh
./test.csh

я получаю эту ошибку

./prog1: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./prog1)

Это мой make-файл

GSLFLAGS := `pkg-config --cflags gsl`  
LIBGSL := `pkg-config --libs gsl`
CFLAGS = -O3 -fopenmp
LIBOMP = -lgomp

dist.o:dist.cxx
    g++ -Wall -c dist.cxx

prog1.o:prog1.cxx
    g++ -Wall -c prog1.cxx  $< ${GSLFLAGS} ${CFLAGS}

prog1:prog1.o dist.o 
    g++ ${CFLAGS} -o  $@ $^ ${LIBGSL} 

prog2.o:prog2.cxx
    g++ -Wall -c prog2.cxx  $< ${GSLFLAGS} ${CFLAGS}

prog2:prog2.o dist.o 
    g++ ${CFLAGS} -o  $@ $^ ${LIBGSL} 

person user3036416    schedule 31.01.2014    source источник
comment
Что вы получаете, когда запускаете ./prog1 из оболочки?   -  person woolstar    schedule 31.01.2014
comment
Работает нормально, вот что странно   -  person user3036416    schedule 31.01.2014
comment
Ваша обычная оболочка /bin/csh? Кроме того, работает ли запуск nohup ./prog1 из командной строки?   -  person woolstar    schedule 31.01.2014
comment
Да nohup ./prog1 тоже работает   -  person user3036416    schedule 31.01.2014
comment
Я рекомендую вам запустить set | grep -i LIB в вашей обычной оболочке, а затем введите ту же команду, что и вторая строка вашего скрипта выше. Затем посмотрите на различия и посмотрите, чего не хватает при запуске в вашем сценарии, а затем исправьте путь поиска библиотеки для сценария.   -  person Mark Setchell    schedule 31.01.2014


Ответы (2)


Похоже, что путь поиска для стандартной библиотеки C++ устанавливается по-разному в csh и при запуске из командной строки.

Статическое связывание стандартных библиотек должно сделать путь поиска библиотеки неактуальным: измените make-файл следующим образом:

CFLAGS = -O3 -fopenmp -static-libgcc -static-libstdc++
person Sergey Kalinichenko    schedule 31.01.2014
comment
Но как работает время? Мне кажется что он параллельно работает прог1 и прог2 два раза а не прог1 прог2 прог1 прог2 - person user3036416; 31.01.2014
comment
@user3036416 user3036416 Разве это не тот эффект, который вы ищете? Ваш скрипт говорит nohup переводить программы в фоновый режим, потому что вы ставите амперсанд & в конце. Если вы хотите запускать их последовательно, удалите амперсанд. Еще лучше развернуть цикл (т.е. описать его действия одно за другим, как предлагает другой ответ), потому что ваш цикл очень короткий. - person Sergey Kalinichenko; 31.01.2014
comment
Я удалил & в конце, и теперь все в порядке! Спасибо - person user3036416; 31.01.2014
comment
Пожалуйста, имейте в виду, ОП, что это своего рода лейкопластырь. Проблема на самом деле в том, что путь поиска вашей библиотеки отличается в ваших двух оболочках. Если вы свяжетесь статически, как предлагается здесь, ваш двоичный файл будет больше, поскольку он будет включать в себя весь библиотечный код, который обычно используется совместно между двоичными файлами, поэтому загрузка и истощение ваших системных ресурсов займет больше времени. У статических ссылок есть и другие недостатки, поэтому подумайте, действительно ли вы хотите это сделать. - person Mark Setchell; 31.01.2014

Если вы действительно хотите сделать то, о чем просите, используйте это:

#!/bin/csh
./prog1
./prog2
./prog1
./prog2

Я чувствую, что вас смущает фоновый процесс и тому подобное.

Запустите prog1, затем prog2, если prog1 завершилась успешно:

./prog1 && ./prog2

Запустите prog1, а затем prog2 независимо от:

./prog1; ./prog2

Запустите прогу1 в фоновом режиме:

./prog1 &

Поспите 8 секунд, затем позвоните в звонок, но немедленно верните мне мою подсказку:

(sleep 3; sleep 5;echo $'\a') &
person Mark Setchell    schedule 31.01.2014
comment
А если у меня много итераций? - person user3036416; 31.01.2014
comment
Ты сказал, что у тебя их двое. - person Mark Setchell; 31.01.2014