как выполнить несколько сценариев оболочки параллельно

Я смущен. У Вас есть электронные письма поддержки, идущие в адрес @gmail.com, который передается к Вашему локальному smtp серверу, выполняющему Ваш домен, который корректен?

Когда Вы пошлете электронные письма, конечно, Вы будете отправлять их с адресами @yourdomain, на который люди попытаются ответить, и Вы хотите возвратить те электронные письма, если человек не является пользователем Gmail? Это кажется действительно плохой идеей. Если Вы хотите произвести на стороне свой спам, обрабатывающий затем, Вы могли бы или использовать Google Apps для домена и иметь хост Google вся Ваша электронная почта, или Вы могли использовать одну из услуг по фильтрации спама, которые находятся между Вами и Вашим доменом.

Учитывая Вас имеют маршрутизатор Linksys, я предполагаю, что Вы работаете на подключении ADSL, которое, вероятно, не разработано для выполнения почтового сервера прочь. Я серьезно полагал бы, что Google наличия размещает Вашу электронную почту, чтобы сохранить все простым и не иметь для волнения об управлении серверами или интернет-соединениями локально.

3
задан 20 November 2012 в 16:04
5 ответов

Ваша текущая установка запускает ваши команды последовательно. Первый запускается, и завершает , позволяя запустить второй. Вторая никогда не заканчивается, поэтому у третьей никогда не будет шанса запуститься.

Попробуйте следующее:

foo.sh >foo.out 2>foo.err &
dog.sh >dog.out 2>dog.err &
cat.sh >cat.out 2>cat.err &

Это укажет каждой команде, что она выполняется в фоновом режиме, и отправит свои выходные данные и информацию об ошибках в файлы. Когда команда выполняется в фоновом режиме, она отключается от текущего сеанса и позволяет выполнить следующую команду. Важно поставить амперсанд ( & ) в качестве последнего символа в строке. В противном случае он может быть распознан неправильно.

В качестве альтернативы, пусть каждый из ваших сценариев оболочки запускает связанный сценарий .php , который вы, очевидно, вызываете, с той же семантикой, что и выше. В этом случае ваш foo.sh может содержать:

11
ответ дан 3 December 2019 в 04:38

У Криса есть хорошая общая идея для большинства сценариев: завершайте каждую команду с помощью & , и они уйдут в фоновый режим. Тем не менее, вот кое-что, что я храню для некоторых более сложных задач. Позвольте представить вам мой удобный скрипт панели инструментов, parallel-exec.pl

    #!/usr/bin/perl
    use threads;
    use Thread::Queue;

    my @workers;
    my $num_threads = shift;
    my $dbname = shift;
    my $queue = new Thread::Queue;

    for (0..$num_threads-1) {
            $workers[$_] = new threads(\&worker);
                    print "TEST!\n";
    }

    while ($_ = shift @ARGV) {
            $queue->enqueue($_);
    }

    sub worker() {
            while ($file = $queue->dequeue) {
                    system ('./parser.pl', $dbname, $file);
            }
    }

    for (0..$num_threads-1) { $queue->enqueue(undef); }
    for (0..$num_threads-1) { $workers[$_]->join; }

С небольшой настройкой вы можете изменить количество потоков, предоставить набор команд и т. Д. В настоящее время требуется количество потоков, указанное в командной строке, имя базы данных и список файлов для импорта, затем порождает по одному экземпляру для каждого файла, запускающего указанное количество одновременно.

2
ответ дан 3 December 2019 в 04:38

Это можно сделать с помощью команды parallel.

Прекрасные примеры: parallel

[me@neo]<bash><~> 19
05:51 Tue Mar 05 > man -f parallel
parallel (1) - run programs in parallel

-

parallel -j 3 -- "sh foo.sh" "sh dog.sh" "sh cat.sh"

Это запустит 3 сценария одновременно, одновременно.

parallel sh -c "echo hi; sleep 2; echo bye" -- 1 2 3

По умолчанию запускается столько процессов одной и той же команды, в зависимости от количества ЦП.

parallel -j 3 sh -c "echo hi; sleep 2; echo bye" -- 1 2 3

Это заставит выполнять 3 процесса одновременно, даже если у вас всего 2 ЦП.

Пример:

[me@neo]<bash><~> 31 
06:09 Tue Mar 05 > parallel -j 10 sh -c "echo Hello World; sleep 3; echo Good morning" -- $(seq 1 10)

Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Good morning
Good morning
Good morning
Good morning
Good morning
Good morning
Good morning
Good morning
Good morning
Good morning
]
7
ответ дан 3 December 2019 в 04:38

или... можно сделать так:

threads=20
tempfifo=$PMS_HOME/$$.fifo

trap "exec 1000>&-;exec 1000<&-;exit 0" 2
mkfifo $tempfifo
exec 1000<>$tempfifo
rm -rf $tempfifo

for ((i=1; i<=$threads; i++))
do
    echo >&1000
done

for ((j=1; j<=1000; j++))
do
    read -u1000
    {
        echo $j
        echo >&1000
    } &
done

wait
echo "done!!!!!!!!!!"

каждый раз параллельно работает 20 потоков.

надеемся, что это поможет :)

.
0
ответ дан 3 December 2019 в 04:38

Попробуйте следующее:

./Cat.sh &
./Dog.sh & 
./foo.sh &

Они будут работать в фоновом режиме.

Для больше контроля над процессами, встроенными в скрипт Python с использованием модуля многопроцессорности

import multiprocessing as mp 
import os
def Run(script_name):
       os.system('./'+script _name+'.sh)
Pool=[]
For s in [your script list]:
     p=mp.Process(target =Run ,args=(s,))
     Pool.append(p)
For p in P:
     p.start()
Fort p in P:
     p.join()
0
ответ дан 3 December 2019 в 04:38

Теги

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