W moim skrypcie mam dwa żądania HTTP. Chciałbym ponownie użyć połączenia, więc na przykład to, co robię, to:

curl -v 'http://example.com?id=1&key1=value1' 'http://example.com?id=1&key2=value2'

Czy jest jakiś sposób, aby przechowywać wyjście każdego żądania HTTP w dwóch różnych zmiennych? Szukałem. Nie znalazłem jeszcze żadnego rozwiązania.

Rozumiem, że mogę wykonać następujące czynności do przechowywania wyjść w dwóch różnych plikach.

curl -v 'http://example.com?id=1&key1=value1' -o output1 'http://example.com?id=1&key2=value2' -o output2

Edytuj: Oto mój przypadek użycia

Mam Cronjob, który działa poniżej równoległej (GNU równolegle) poniżej co kilka minut. A "Get_data.SH" zostanie uruchomiony 2000 razy, ponieważ w Input.csv ma 2000 wierszy. Chciałbym uniknąć używania pliku TMP, aby uzyskać najlepszą wydajność.

parallel \
  -a input.csv \
  --jobs 0 \
  --timeout $parallel_timeout \
  "get_data.sh {}"

W get_data.sh:

id=$1
curl -v "http://example.com?id=${id}&key1=value1" -o output1 \
"http://example.com?id=${id}&key2=value2" -o output2

stat1=$(cat output1 | sed '' | cut ..)
stat2=$(cat output2 | awk '')
1
Jerry 23 marzec 2020, 18:16

2 odpowiedzi

Najlepsza odpowiedź

Szukasz parset. Jest częścią env_parallel, która jest częścią pakietu równoległego GNU (HTTPS: //www.gnu.org/software/paralle/parset.html):

parset myarr \
  -a input.csv \
  --jobs 0 \
  --timeout $parallel_timeout \
  get_data.sh {}

echo "${myarr[3]}"

Możesz mieć parset Uruchom wszystkie kombinacje - tak jakbyś z GNU równoległą:

echo www.google.com > input.txt
echo www.bing.com >> input.txt

# Search for both foo and bar on all sites
parset output curl https://{1}/?search={2} :::: input.txt ::: foo bar

echo "${output[1]}"
echo "${output[2]}"

Jeśli robisz różne przetwarzanie dla foo i bar Możesz wykonać funkcje i uruchomić te:

# make all new functions, arrays, variables, and aliases defined after this
# available to env_parset
env_parallel --session

foofunc() {
  id="$1"
  curl -v "http://example.com?id=${id}&key1=value1" | sed '' | cut -f10
}

barfunc() {
  id="$1"
  curl -v "http://example.com?id=${id}&key2=value2" | awk '{print}'
}

# Run both foofunc and barfunc on all sites
env_parset output {1} {2} ::: foofunc barfunc :::: input.txt

echo "${output[1]}"
echo "${output[2]}"
env_parallel --end-session

--(end-)session i env_parset są potrzebne, jeśli nie chcesz export -f funkcji i zmiennych, których używasz w funkcjach.

GNU równoległy wykorzystuje tempfiles. Jeśli polecenie działa szybko, te tempfiles nigdy nie dotykają dysku, zanim zostaną usunięte. Zamiast tego pozostają w pamięci podręcznej dysku w pamięci RAM. Możesz nawet zmusić ich do pozostania w pamięci RAM, wskazując --tmpdir do ramdisk:

mkdir /dev/shm/mydir
parset output --tmpdir /dev/shm/mydir ...
2
Ole Tange 9 kwiecień 2020, 08:13

OK, oto jakaś inspiracja:

id=$1
output1=$(curl -v "http://example.com?id=${id}&key1=value1")
output2=$(curl -v "http://example.com?id=${id}&key2=value2")

stat1=$(echo "$output1" | sed '' | cut ..)
stat2=$(echo "$output2" | awk '')

W ten sposób unikasz pisania rzeczy na dysku.

0
Jonas 25 marzec 2020, 21:27