LINUX.ORG.RU

Как запустить асинхронно (в фоне) несколько комманд разом?

 , ,


0

2

Короче, я сделал такую фигню

#!/usr/local/bin/io

args := System args
path := args at(1)
scripts := args slice(2)
run := method(System system("/" .. path .. "/" .. self))

scripts foreach(run)
скрипт имеет путь, допустим, /with например вводим
/with thedir script1 script2 script3
тогда в args будет list(«script1», «script2», «script3»)

Для каждого элемента списка выполняется полный путь к скрипту (/thedir/scriptN в данном случае). То есть, эти скрипты просто выполняются.

Все работает нормально, но только при синхронных вызовах. Когда мне надо запустить демонов в фоне

/with thedir script1& script2& script3&
он запускает первый скрипт нормально, причем не в фоне, а блокирует, и при этом вылезает ошибка, bash: script2 команда не найдена. Почему это происходит? Как исправить? Можно решение на шелле или баше.

Ответ на: комментарий от quest2017

Откуда он знает решение, главное — кукарекнуть вовремя, чтобы умным показаться.

anonymous ()
Ответ на: комментарий от quest2017

А я никогда и не говорил, что знаю баш.

Баш здесь не причем.

Ну так чо, решение то будет?

Нет, конечно. Учи шелл.

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

Так это ж практика, скоро он найдёт фундаментальные проблемы в «модели вычислений» баша и начнет постить своё обычное. Или наоборот!

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

Нет, ты не понял. Задача не в том, чтобы запустить 3 команды в фоне, это можно и вручную сделать. Задача в том, чтобы написать скрипт, принимающий призвольное число названий скриптов из директории, поданной первым аргументом, и выполняющий их все. То есть должно быть так:

если я пишу

with dir foo bar baz

у меня синхронно выполняются /dir/foo, /dir/bar и /dir/baz

Если пишу

with dir foo& bar& baz&
скрипты /dir/foo /dir/bar и /dir/baz запускаются в фоне, не блокируя IO.

А твое «решение на POSIX sh» — это я и без тебя знаю.

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

Есть все, кроме возможности запустить тред?

Да, я знаю, что это может быть дорого, но ио и так тормозной. Зато прогрессивный.

cdshines ★★★★★ ()
Последнее исправление: cdshines (всего исправлений: 1 )
Ответ на: комментарий от quest2017

with dir foo& bar& baz&

Оно даже не дойдёт до твоего скрипта — баш будет думать, что ты хочешь запустить: 1) «with dir foo&» — «with dir foo» в фоне; 2) «bar&» — «bar» в фоне; 3) «baz&» — «baz» в фоне.

Т.ч. экранируй: with dir foo\& bar\& baz\&. И гугли, как на твоём io запустить процесс в фоне (т.е. fork + exec, не дожидаясь завершения).

На баше это будет как-то так:

for arg in "${@:2}"; do
    if [[ "$arg" == *'&' ]]; then
        echo "$1"/"${arg%'&'}" \&
    else
        echo "$1"/"$arg"
    fi
done

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

На баше это будет как-то так:

Нет, это был проверочный скрипт.

for arg in "${@:2}"; do
    if [[ "$arg" == *'&' ]]; then
        "$1"/"${arg%'&'}" &
    else
        "$1"/"$arg"
    fi
done
anonymous ()
Ответ на: комментарий от cdshines

Нет, запустить нитку внутри самого io просто. foo @bar это все, причем это выражение вернет фьючер, к которому можно обратится как к обычному объекту. Там не какое то быдляцкое говно, как в жабе, там параллелизм на основе акторов.

Проблема то в том, чтобы не внутри Io запустить, а чтобы Io запустил.

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

Там не какое то быдляцкое говно, как в жабе,

Но ведь ты не знаешь, как в жаве. А там точно так-же

выражение вернет фьючер, к которому можно обратится как к обычному объекту

// мимо-считающий-что-и-io-и-джава-херня

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

экранируй: with dir foo\& bar\& baz\&.

Собственно, этого оказалось достаточно, все работает, спасибо.

ЗЫ А все таки это косяк, что баш сует свой нос в аргументы, которые ему не предназначены. Логично было бы, если бы он запускал скрипт и сразу передавал ему управление, а не парсил всю строку.

quest2017 ()
Ответ на: комментарий от cdshines

Да, я знаю, что это может быть дорого

Кстати, тут ты тоже лоханулся

Io uses coroutines (user level cooperative threads), instead of preemptive OS level threads to implement concurrency. This avoids the substantial costs (memory, system calls, locking, caching issues, etc) associated with native threads and allows Io to support a very high level of concurrency with thousands of active threads.

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

Косяк все же у тебя в ДНК. Сделай-ка реализацию того, что ты видишь логичным.

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

Там не какое то быдляцкое говно, как в жабе, там параллелизм на основе акторов.

Правда в том быдляцком говне, в жабе, таких проблем нет :) А в спер крутом io - даже борща не хлебанёшь .... парадокс аднака! :))

anonymous ()
Ответ на: комментарий от quest2017

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

Муа-ха-ха :) В Ставке Гитлера гутарят что io-шенги - чмошнеги и малахольные на всю дупу, это у них вместо головы. :)

anonymous ()

странно, что никто еще не написал самого простого:

man xargs

anonymous ()
Ответ на: комментарий от Deleted

Нет

Ты, по ходу нулевой, на реальных машинах параллелизм реализован на основе модели Акторов (единственно возможная реализация). Твои треды на уровне оси, и твоей сраной жабы — это просто сахарок над реальным параллелизмом.

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

Канеш, канеш.

Сходи лучше аккаунт новый создай.

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