Оболочка Linux работает одновременно с программированием - PullRequest
1 голос
/ 11 октября 2010

Мне нужно 10 раз запустить программу, скажем ./a в оболочке linux. Какова команда, чтобы сделать это?

Кроме того, как я могу отличить вывод от разных процессов?

Кроме того, мой ./a - это непрерывный процесс. Как я мог прекратить это?

Спасибо.

Ответы [ 5 ]

3 голосов
/ 11 октября 2010

В bash вы можете сделать:

for ((i=1;i<=10;i++)); do

  # run the command ./a and redirect its output to a file named after
  # its sequence number...like out1.txt, out2.txt...
  ./a > out$i.txt &   

done

Ключ здесь - &, который запускает команду в фоновом режиме. Без & 2-й ./a будет запущен после того, как кулак закончен, что делает его серийным исполнением. Но с & мы не ждем завершения одного вызова ./a, прежде чем запустить другой, и именно так мы достигаем параллелизма.

3 голосов
/ 11 октября 2010

Сделать цикл, который запускает программу 10 раз в фоновом режиме:

for i in $(seq 1 10) ; do
 ./a &
done

Кроме того, как я могу отличить вывод от разных процессов?

Выне может легко сделать это, выход может быть переплетен.Вместо этого перенаправьте выходные данные каждого процесса в отдельный файл, например,

for i in $(seq 1 10) ; do
 ./a >output.$i  &
done

В качестве единственного пользователя вы запустите

for i in $(seq 1 10) ; do ./a >output.$i  & done

, чтобы позже уничтожить эти процессы:

for i in $(seq 1 10) ; do kill %$i ; done
1 голос
/ 11 октября 2010
for i in {1..10}
do
  ./a > "out_${i}.txt" &
done

для завершения a, вы можете использовать pkill a

0 голосов
/ 11 октября 2010

Все остальные ответы пока хороши, но вы также можете попробовать repeat, если поддерживается вашей системой:

repeat 10 ./a

Здесь, чтобы дифференцировать выходные данные, к сожалению, вы не сможете использовать переменную счетчика. Однако вы можете использовать временную метку:

repeat 10 ./a  >> output_`date +%N`

При этом поведение date для чего-либо ниже второй отметки не определено, так что это не самый надежный способ. Немного проще, чем написать цикл for.

0 голосов
/ 11 октября 2010

Если вы используете Bash или совместимую оболочку, специальная переменная $! содержит идентификатор последнего выполненного вами асинхронного процесса.Добавляя ответ nos, я бы предложил использовать

for i in $(seq 1 10) ; do
    ./a 1> stdout.$i 2> stderr.$i &
    echo $! > pid.$i
done

Теперь у вас есть вывод ошибок в stdout.X, вывод ошибок в stderr.X и идентификатор процесса в pid.X, так что вы можете убить его с помощью

kill `cat pid.X`

или даже убить все процессы с помощью

for i in $(seq 1 10) ; do
    kill `cat pid.$i`
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...