По причинам, объясненным ниже, я хотел бы эмулировать семантику fork()
в скрипте PowerShell (клонирование процесса в полной среде, включая загруженные модули, функции и текущие переменные).
Я посмотрелв
Все это потребует различной степени рефакторинга из-за того, как мой код был изначально структурирован и вырос - и яЯ не уверен в ценности рефакторинга на данный момент, но сделать шаг вперед может быть лучший путь вперед.
Invoke-Parallel -ImportFunctions -ImportModules -ImportVariables
похоже, что это будет ближе всего к тому, что я хочу или думаю, что мне нужно, но....
Мне бы очень хотелось услышать от людей, которые использовали эти различные альтернативы на основе RunSpace, чтобы убедиться, что я на правильном пути, и максимально эффективно сосредоточить свои усилия.
Предыстория:
Я написал довольно сложныйСкрипт PowerShell с поддержкой модулей для перемещения файлов между отключенными сетевыми доменами / сегментами.Первоначально он основывался на опросах (некоторое время спал, опрашивал исходные серверы на наличие файлов, перемещал их в целевые папки, возвращался в спящий режим) и работал хорошо ...
... до тех пор, пока мы не столкнулись с проблемойобрезание больших файлов: насколько я могу судить, в семантике файловой системы Windows отсутствует 100% надежный способ программной проверки завершения записи файла (блокировки не обязательны, блокировка не всех программ, LastWriteTime
НЕ обновляется, пока файлызаписываются, Length
устанавливается сразу в конечную длину и не обновляется во время записи и т. д.).Если вы знаете, как решить эту проблему, 100% надежно изнутри PowerShell, это тоже может помочь ...!
Из-за того, как оно началось, как его собирались использовать,мой сервер был написан как монолитный процесс с одним потоком управления - это не совсем верно, но достаточно близко, чтобы дать вам представление о том, где я нахожусь.
Затем я перешел в простую сетьМодель -invocation: пользователи готовят файлы для перемещения, помещают их в исходную папку, а затем вызывают UDP-клиент, который отправляет короткое сообщение «сделать эту передачу» моему процессу PowerShell, который прослушивает несколько сетевых интерфейсов.
Было очень легко добавить код listen
и readFromTheNetwork
к существующему процессу с одним потоком управления, и мы устранили все ошибки.Он надежный и просто работает , поэтому я не люблю рефакторинг, но вот недостаток: он может быть только в одном из трех состояний:
- Ожидание запросов
- Подтверждение запроса или возврат подтверждения выполненных запросов, или
- Выполнение запроса (перемещение файлов из A в B, что может занять довольно много времени).
Это означает, что если второй запрос поступит во время обработки первого, он в конечном итоге будет обработан, но не может быть подтвержден - и чтобы дать обратную связь с пользователями, я установил пятисекундный тайм-аут в клиенте вызова: если в течение 5 не получен ответ, предположим, что служба занята или не работает, проверьте ее или попробуйте еще раз позже.
Я хотел бы улучшить это для пользователей, запустив процесс запуска отдельной подзадачи для перемещения файлов, но ....
... в части операции по перемещению задействовано много состояний (импортированные функции и модули, сетевые учетные данные, сетевые расположения, Fine-C).подробности контроля (следует ли выполнять проверки целостности, фильтровать ли файлы и как и т. д.)).Похоже, что единственная утилита, которую я нашел близко, - это Invoke-Parallel
- и здесь я обращаюсь к сообществу за опытом работы с этой и другими утилитами, страшилками и т. Д.
Много лет назад я написал много серверов под UNIX и несколько под Linux: это было намного проще из-за fork()
, который позволяет родителю обрабатывать все настройки, импорт кода, проверку конфигурации и операцию прослушивания / принятия.затем создайте дочерний элемент, который может независимо выполнять желаемую операцию, используя существующее состояние, унаследованное от родительского элемента.(Конечно, это не идеально, мне нужно беспокоиться о побочных процессах и других вещах, но основная линия, родительская, будет намного дольше, чем работающие дочерние элементы, и если она умрет, есть серьезная ошибка,требует вмешательства человека.)
Итак.Предполагая, что мне нужно провести рефакторинг, какая из различных доступных альтернатив кажется вам наиболее эффективным способом передачи большого количества состояния процесса из одного процесса Windows в другой, сводя к минимуму операцию рефакторинга?
Большое спасибо.