Многопоточность сценария Bash в командах curl

При первом вызове sudo запрашивается пароль. Затем, в зависимости от конфигурации, при вызове в течение N минут (по умолчанию 5 минут IIRC) не нужно повторно вводить пароль.

Вы можете сделать что-то вроде:

sudo echo >/dev/null || exit 1

или, возможно, что-то вроде:

sudo -p "Become Super: " printf "" || exit 1

в начале скрипта.

Если вы хотите запретить кому-либо выполнять sudo ./your_script, вам также следует проверить EUID ( bash ):

if [[ $EUID -eq 0 ]]
then
    printf "Please run as normal user.\n" >&2
    exit 1
fi

или что-то вроде:

if [ "$(id -u)" = "0" ]
   ...

В любом случае также проверьте, на какую оболочку вы нацеливаетесь. Т.е.

и т. Д.


Чтобы «сохранить его в живых» , можно было бы сделать что-то вроде :

while true; do
  sleep 300
  sudo -n true
  kill -0 "$$" 2>/dev/null || exit
done &

5
05.04.2017, 14:52
3 ответа

Вы столкнулись с проблемой параллельного добавления к файлу. Простой ответ: не надо.

Вот как это можно сделать с помощью GNU Parallel:

doit() {
    url="$1"
    uri="$2"
    urlstatus=$(curl -o /dev/null --insecure --silent --head --write-out  '%{http_code}' "${url}""${uri}" --max-time 5 ) &&
    echo "$url  $urlstatus $uri"
}
export -f doit

parallel -j200 doit :::: url uri >> urlstatus.txt

GNU Parallel по умолчанию сериализует вывод, поэтому вы не получите вывод одного задания, смешанный с выводом другого.

9
27.01.2020, 20:35

Хотя вы можете запускать несколько процессов асинхронно (используя синтаксис « shellcmd & ») в оболочке, подпроцесс может (и часто так и происходит) завершиться до того, как ваша следующая команда сможет захватить его вывод. И, как указал @ Ole-Tange, нет способа гарантировать запись этого вывода в файл в правильном порядке!

Многие хотят использовать другой язык сценариев, где можно управлять несколькими потоками, вместо использования сценария оболочки ...

1
27.01.2020, 20:35

Чтобы выполнить параллельную передачу нескольких curl, нам нужно взглянуть на другой инструмент :xargs.

Если вы не знакомы с xargs, это очень мощная утилита Linux. С его помощью мы можем выполнять несколько (динамических )curl-команд параллельно с очень небольшими накладными расходами. Пример:

seq 1 3 | xargs -n1 -P3 bash -c 'i=$0; url="http://mytestserver.net/10m_test.html?run=${i}"; curl -O -s $url'

Этот код будет запускать 3 команды curl параллельно. Параметр -P позволяет установить желаемое количество параллельных выполнений. В этом примере мы используем команду seq для передачи числовых аргументов нашим командам, чтобы каждый URL-адрес был уникальным с номером запуска. Параметр -n просто ограничивает количество аргументов, передаваемых за одно выполнение. Параметр -c — это место, где мы указываем нашу команду для запуска.

Обратите внимание, что этот пример не дает никакого вывода, он просто запускает передачи. Если вы хотите сохранить вывод, вы можете использовать предыдущее обсуждение формата вывода, чтобы решить, что вы хотите вывести и как это сохранить.

Отсюда вы можете увеличить количество итераций, передать другие интересные параметры, (список URL-адресов из файла, возможно, )и так далее.Мы часто используем этот тип команды при создании фонового трафика для имитации определенных сетевых условий.

-1
03.11.2020, 11:04

Теги

Похожие вопросы