LINUX.ORG.RU
ФорумAdmin

bash. Передача переменных из скрипта в скрипт


0

2

Доброго дня!
Есть скрипт.
for....
...
./some_exec.sh $number $code $url &
done
Сейчас some_exec.sh сваливает результаты работы в temp_1.txt таким образом:
echo «$result» >> temp_1.txt
Далее происходит загрузка файла temp_1.txt и его содержимое
запихивается в mysql
НО! При запуске более 40 экземпляров происходит значительный рост времени на some_exec.sh при обращении к temp_1.txt, что сказывается на загрузке CPU и как результат на обработке всех данных.

Вопрос: есть ли способ передать данные переменной $result, назад в скрипт «родитель» без создания временных файлов?






пусть some_exec.sh выдает результат работы на stdout, который можно было бы положить в переменную, например: result=«$(./some_exec.sh $number $code $url)»

dGhost ★★★
()
Ответ на: комментарий от dGhost

Однако это идея! Спасибо, попробую!

gich
() автор топика
Ответ на: комментарий от dGhost

Этот метод приводит к тому, что код выполняется последовательно. Отрабатывает первое обращение к ./some_exec.sh, получает ответ, потом второе, третье итд.
Задача же состоит именно в многопоточности обработки данных.

gich
() автор топика
Ответ на: комментарий от gich

А не пробовал открыть несколько fifo (man mkfifo) и пулять через них?

wheel
()

Переменные с дрго-го скрипта (текстового файла) можно вызывать при помощи

 
#!/bin/bash
. /home/user/drugoi-script.sh

Tok ★★
()
Ответ на: комментарий от gich

Задача же состоит именно в многопоточности обработки данных.

И записи всех результатов в одну единственную переменную одновременно?

NightSpamer
()
Ответ на: комментарий от Tok

. /home/user/drugoi-script.sh &
Вот в таком сочетании это не работает.

gich
() автор топика
Ответ на: комментарий от NightSpamer

И записи всех результатов в одну единственную переменную одновременно?

Это бы в идеале.
Итог

result=«$(./some_exec.sh $number $code $url)»

в режиме отдельного процесса не запускается.

. ./home/user/drugoi-script.sh &

переменные в режиме отдельного процесса не передаёт.
Всякие export тоже работать не будут, тк это передача переменных от родителя, но не наоборот.

gich
() автор топика
Ответ на: комментарий от schizoid

sqlite попробуй.

А это то тут при чём? Делать запрос от дочернего процесса можно. НО!
это сейчас 40 дочерних процессов, в перспективе 2000. 2000 коннектов в БД + 2000 запросов? Даже если передавать коннект переменной в дочерний процесс, MySQL на это скажет O_____o и задумается о смысле жизни.

Или я не прав?
На php тем более нет смысла реализовывать многопоточность, ТК он медленный что ужас.

gich
() автор топика
Ответ на: комментарий от gich

Или я не прав?

Нет.

Ты вторую часть моего поста пропустил, видимо.

А ещё попробуй-таки действительно ознакомиться с БД и с другими технологиями, которые появились за последние 30 лет.

schizoid ★★★
()
Ответ на: комментарий от gich

можно заранее составить список команд и выполнить все сразу, например:

 % cat exec.sh 
#!/usr/bin/env bash

echo "exec $1";
sleep 2;
 % cat for.sh 
#!/usr/bin/env bash

for i in {1..5}
do
  com+="./exec.sh $i & "
done

out=`eval $com`
wait
echo -e "out:\n$out"
 % time ./for.sh 
out:
exec 1
exec 3
exec 4
exec 5
exec 2

real	0m2.022s
user	0m0.001s
sys	0m0.006s
 % 
dGhost ★★★
()

Если разместить этот файл на tmpfs легче становится?

Вобще, то, что от работы с файлом растёт загрузка ЦП звучит как-то странно. Вобще 40 одновременных процессов и должны грузить ЦП, но не факт, что из-за вывода в один файл.

Не знаю, насчтё того, чтобы делать на bash взаимодействие с 2000 порождённых процессов. Напишите на другом ЯП неблокирующеся чтение из popen.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.