удар: запустите несколько цепочечных команд в фоне

  • Первая скобка создает новый анонимный внутренний класс.
  • Второй набор фигурных скобок создает инициализаторы экземпляра, такие как статический блок в классе.
  • Например:

       public class TestHashMap {
        public static void main(String[] args) {
            HashMap map = new HashMap(){
            {
                put("1", "ONE");
            }{
                put("2", "TWO");
            }{
                put("3", "THREE");
            }
            };
            Set keySet = map.keySet();
            for (String string : keySet) {
                System.out.println(string+" ->"+map.get(string));
            }
        }
    
    }
    

    Как это работает

    Первая скобка создает новый анонимный внутренний класс. Эти внутренние классы способны получить доступ к поведению своего родительского класса. Итак, в нашем случае мы фактически создаем подкласс класса HashSet, поэтому этот внутренний класс способен использовать метод add ().

    И Второй набор фигурных скобок - это ничего, кроме инициализаторов экземпляров. Если вы напомните основные концепции Java, вы можете легко связать блоки инициализатора экземпляра со статическими инициализаторами из-за аналогичной структуры, подобной структуре. Единственное отличие состоит в том, что статический инициализатор добавляется с ключевым словом static и запускается только один раз; независимо от того, сколько объектов вы создаете.

    more

44
задан nwinkler 29 February 2016 в 10:20
поделиться

7 ответов

Я не протестировал это, но как насчет

print `(touch .file1.lock; cp bigfile1 /destination; rm .file1.lock;) &`;

, средние круглые скобки выполняются в подоболочке, но это не должно причинять боль.

30
ответ дан Hugh Allen 26 November 2019 в 21:56
поделиться

Попытайтесь поместить команды в фигурные скобки с & s, как это:

{command1 & ; command2 & ; command3 & ; }

Это не создает подоболочку, но выполняет группу команд в фоновом режиме.

HTH

1
ответ дан Zsolt Botykai 26 November 2019 в 21:56
поделиться
for command in $commands
do
    "$command" &
done
wait

амперсанд в конце команды работает, это в фоновом режиме, и эти wait ожидает, пока фоновая задача не выполнена.

14
ответ дан adam_0 26 November 2019 в 21:56
поделиться

Hugh спасибо, который сделал это:

adrianp@frost:~$ (echo "started"; sleep 15; echo "stopped")
started
stopped
adrianp@frost:~$ (echo "started"; sleep 15; echo "stopped") &
started
[1] 7101
adrianp@frost:~$ stopped

[1]+  Done                    ( echo "started"; sleep 15; echo "stopped" )
adrianp@frost:~$ 

другие идеи не работают, потому что они запускают каждую команду в фоновом режиме, и не последовательность команды (который важен в моем случае!).

Еще раз спасибо!

20
ответ дан Mad_Ady 26 November 2019 в 21:56
поделиться

Я не знаю, почему никто не ответил с надлежащим решением:

my @children;
for (...) {
    ...
    my $child = fork;
    exec "touch .file1.lock; cp bigfile1 /destination; rm .file1.lock;" if $child == 0;
    push @children, $child;
}
# and if you want to wait for them to finish,
waitpid($_) for @children;

Это заставляет Perl порождать детей для выполнения каждой команды и позволяет Вам ожидать всех детей для завершения перед продолжением.

Между прочим,

print `some command`

и

system "some command"

произведите то же содержание к stdout, но первое имеет более высокие издержки, поскольку Perl должен получить весь из"some command"вывод

1
ответ дан ephemient 26 November 2019 в 21:56
поделиться

Можно передать параметры оперативной группе штаба (имеющий последовательные команды) и выполнить их в фоне.

for hrNum in {00..11};
do
    oneHour=$((10#$hrNum + 0))
    secondHour=$((10#$hrNum + 12))
    { echo "$oneHour"; echo "$secondHour"; } &
    wait
done
0
ответ дан 26 November 2019 в 21:56
поделиться

GavinCattell подошел ближе всех (для bash, IMO), но, как указал Mad_Ady, он не будет обрабатывать файлы «блокировки». Это должно:

Если есть другие ожидающие задания, wait также будет ожидать их. Если вам нужно дождаться только копий, вы можете накапливать эти PID и ждать только их. Если нет, вы можете удалить 3 строки с «pid», но это более общий вариант.

Кроме того, я добавил проверку, чтобы полностью избежать копирования:

pids=
for file in bigfile*
do
    # Skip if file is not newer...
    targ=/destination/$(basename "${file}")
    [ "$targ" -nt "$file" ] && continue

    # Use a lock file:  ".fileN.lock" for each "bigfileN"
    lock=".${file##*/big}.lock"
    ( touch $lock; cp "$file" "$targ"; rm $lock ) &
    pids="$pids $!"
done
wait $pids

Кстати, похоже, что вы копируете новые файлы на FTP репозиторий (или аналогичный). Если это так, вы можете рассмотреть стратегию копирования / переименования вместо файлов блокировки (но это уже другая тема).

5
ответ дан 26 November 2019 в 21:56
поделиться
Другие вопросы по тегам:

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