Цикл, монтирующийся параллельно

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

От: https://github.com/rvoicilas/inotify-tools/wiki/#wiki-info

#!/bin/sh
EVENT=$(inotifywait --format '%e' ~/file1)
[ $? != 0 ] && exit
[ "$EVENT" = "MODIFY" ] && echo 'file modified!'
[ "$EVENT" = "DELETE_SELF" ] && echo 'file deleted!'

Это в основном мгновенно - inotify, функция ядра, которую эти инструменты используют в своих интересах который запросы уведомления о ядре на очень определенных событиях файловой системы.

3
09.08.2013, 10:19
3 ответа

Я думаю, что это очевидно, но

typeset -i M=1
while [ $M -le 102 ]
  do
    mount mysourcedevice$M targetdir$M &
    let M++
done
wait

Должен сделать задание. wait будет ожидать, пока все sub-processess не закончены, прежде, чем выполнить следующую команду.

5
27.01.2020, 21:10
  • 1
    Если я должен добавить, "ожидают" в конце цикла затем нет никакого смысла, вызов монтирует команду в фоне –  SHW 09.08.2013, 15:28
  • 2
    @SHW GRUB, который ожидание вне/после того, как цикла. Цикл запускается, все монтируется в параллели. Я предполагаю, что Вы хотите сделать что-то после того, как параллель монтируется, закончились. –  Nils 10.08.2013, 00:18
  • 3
    Да... После параллельного монтирования я запускаю X. и запускаться X, все циклические устройства ДОЛЖНЫ быть смонтированы заранее –  SHW 10.08.2013, 10:30
  • 4
    @SHW, Этот код монтирует их параллельно; можно сделать другой материал после ожидания. Нет ничего больше, чтобы быть сделанным. В то время как версия C может быть немного быстрее все еще (испытывает недостаток в издержках вызова mount управляйте сто раз), это обычно не практично. –  frostschutz 12.08.2013, 14:04
  • 5
    соглашается с @frostschutz, пробует версию C, только если производительность является проблемой. –  Alex 13.08.2013, 14:59

Возможно, потоковая версия могла быть немного быстрее, необходимо корректироваться mount() параметры самостоятельно.

#include <stdio.h>
#include <pthread.h>
#include <sys/mount.h>
#include <string.h>
#include <errno.h>

#define DEVS 100

static void *mountt(void *d)
{
    int i = (int)d;
    char loop[48], mp[48];

    snprintf(loop, 47, "/dev/loop%d", i);
    snprintf(mp, 47, "/mnt/%d", i);

    if (mount(loop, mp, "ext2", MS_MGC_VAL | MS_RDONLY | MS_NOSUID, "") < 0)
        fprintf(stderr, "mount[%d]: failed: %s\n", i, strerror(errno));

    return NULL;
}

int main(int argc, char **argv)
{
    int i;
    pthread_t tt[DEVS];

    for (i=0; i<DEVS; i++) {
        if (pthread_create( &tt[i], NULL, mountt, (void*)i) != 0)
            fprintf(stderr, "thread create[%d] failed: %s\n", i, strerror(errno));
    }

    for (i=0; i<DEVS; i++)
        pthread_join(tt[i], NULL);

    return 0;
}

gcc -O2 -Wall -o mountt mountt.c -lpthread

4
27.01.2020, 21:10
  • 1
    Спасибо. Я проверю сначала и затем обновлю Вас –  SHW 12.08.2013, 12:24

При использовании GNU Parallel это выглядит так:

seq 100 | parallel -j0 mount device{} dir{}

Если у вас есть список каталогов:

parallel -j0 mount device{#} {} ::: dirs*

Если у вас есть список устройств:

parallel -j0 'mkdir -p dir{#}; mount {} dir{#}' ::: device*

GNU Parallel - это общий распараллеливатель, который упрощает параллельное выполнение заданий на одной или нескольких машинах, к которым у вас есть доступ по ssh. Часто может заменить цикл на .

Если у вас есть 32 различных задания, которые вы хотите запустить на 4 процессорах, простой способ распараллеливания - запустить 8 заданий на каждом процессоре:

Simple scheduling

GNU Parallel вместо этого порождает новый процесс, когда один из них завершается, - поддерживая активность процессоров и тем самым экономя время:

GNU Parallel scheduling

Установка

Если GNU Parallel не упакован для вашего дистрибутива, вы можете выполнить персональную установку, для которой не требуется root-доступ. Это можно сделать за 10 секунд, выполнив следующие действия:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Другие варианты установки см. http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Подробнее

] См. Другие примеры: http://www.gnu.org/software/parallel/man.html

Посмотрите вступительные видеоролики: https://www.youtube.com/playlist?list= PL284C9FF2488BC6D1

Ознакомьтесь с руководством: http://www.gnu.org/software/parallel/parallel_tutorial.html

Подпишитесь на список рассылки, чтобы получить поддержку: https: // lists .gnu.org / mailman / listinfo / parallel

0
27.01.2020, 21:10

Теги

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