Я собрал небольшой менеджер процессов для запуска взаимодействующих программ.
Смысл был в том, чтобы сделать что-то простое и быстрое. Этого было несложно добиться, используя Svelte для веб-страницы, node.js и т.д. для моего сервера. И я добавил класс message-relay-services.
Вы можете установить его и использовать самостоятельно:
npm install -g copious-transitions-manager
Вы можете получить пример конфигурационного файла с помощью get-npm-assets
get-npm-assets copious-tm
Затем вы можете запустить свою программу, вызвав
copious-tm manager.conf
После запуска вы можете перейти на веб-страницу:
https://localhost:8989/
Отсюда вы можете управлять процессами, которые видите в списке.
Читателю предлагается копаться в коде, предлагать проблемы, делать запросы и т.д. Действительно, код включает примеры Svelte, node.js, polka.js, websockets и message-relay-services.
copious-transitions-manager README.md:
Простое веб-приложение для управления процессами и обмена данными между ними.
Время выполнения обеспечивает эти две функции:
- Сервер с веб-страницей для запуска, остановки, обновления и т.д. процессов.
- Простая система обмена сообщениями, которая позволяет процессам обмениваться сообщениями.
Процессы управляются как дочерние процессы процесса copious-transitions-manager. Дочерние процессы могут посылать сообщения процессу copious-transitions-manager для хранения объектов или получения объектов. Это простые применения структур данных JavaScript.
Пока что этот инструмент хорош для управления базовой конфигурацией для тех, кто пробует процессы, которые также могут общаться друг с другом. Время выполнения совместимо с процессами, использующими коммуникационные интерфейсы, предоставляемые message-relay-services.
Установите
npm install -g copious-transitions-manager
Основные операции
- Установить процесс из npm
- Удалить процесс
- Запустить процесс
- Остановить процесс
- Список процессов
- Установить параметры конфигурации верхнего уровня….
Запустить
copious-tm manager.conf
Файл конфигурации представляет собой JSON-объект, который описывает, как вызывать программы из командной строки.
Вы можете получить пример файла manager.conf в свой рабочий каталог, используя get-npm-assets
get-npm-assets copious-tm
Вот как это выглядит:
{
"password" : "your password",
"web_page_port" : 8989,
"wss_app_port" : 8990,
"all_procs" : {
"test1.sh" : {
"name" : "test1.sh",
"run_on_start" : false,
"attempt_reconnect" : false,
"runner" : "bash",
"args" : ["test/test1.sh","Print this message"]
},
"test2.js" : {
"name" : "test2.js",
"run_on_start" : false,
"attempt_reconnect" : true,
"runner" : "node",
"args": [
"test/test2.js",
"test/test2.conf"
]
},
"test3.js" : {
"name" : "test3.js",
"run_on_start" : false,
"attempt_reconnect" : false,
"runner" : "node",
"args": [
"test/test3.js",
"test/test3.conf"
]
}
}
}
Поля верхнего уровня выглядят следующим образом:
- пароль :: вы должны ввести его на веб-странице, чтобы все заработало.
- web_page_port :: это порт html-сервера. Перейдите по IP вашего компьютера и укажите этот порт, например:
http://<ip моей машины>:8989
. - wss_app_port :: это для вебсокета.
- all_procs :: это карта имен процессов к их описаниям. Веб-страница узнает о них при запуске.
Посмотрите на различные описания процессов. Вы увидите, что они ссылаются на программы и их описания.
Давайте подробнее рассмотрим поля для описания процессов.
- имя :: имя, идентифицирующее процесс
- run_on_start :: запускать ли процесс сразу после появления менеджера или ждать, пока администратор запустит его с веб-страницы
- attempt_reconnect :: если процесс завершился неудачно, должен ли менеджер попытаться перезапустить его?
- runner :: имя программы, использующей параметры. Это будет то, что запускается во внешней части процесса. Она может запускать скрипт, упомянутый в аргументах, или это может быть имя двоичного исполняемого файла.
- args параметры, которые передаются исполнителю.
Например, «test3.js» имеет «node» runner node.js. Первый параметр списка argments — это файл javascript в каталоге test. Таким образом, «test3.js» будет доступен для запуска со страницы тестирования.
После запуска менеджера вы можете перейти на веб-страницу:
http://<my machine's ip>:8989
На веб-странице вы можете выбрать процесс, найти раздел «op» и нажать на кнопку «run».
Веб-страница
Вы можете посмотреть, как выглядит веб-страница здесь: веб-страница
Примечание: на этой странице ничего не работает. Компьютер не доступен для публичной работы. Только для просмотра…
На первой странице вы можете увидеть кнопки:
- обзор
- stdout
- ops
При нажатии на них отображаются различные панели.
Первая панель, обзор, показывает окно со списком (процессы будут видны там, если вы попробуете). Выбор процесса делает его доступным для использования в панели ops. Его также можно удалить, используя «remove» на передней панели.
В обзоре вы можете добавить процесс в конфигурационный файл. Вы можете запустить командную строку с помощью кнопки exec. Вы можете установить модули npm или удалить их. Кнопки ведут к диалоговым окнам, помогающим ввести значения полей.
На панели stdout можно просмотреть вывод терминала процесса.
На панели ops вы можете запустить, остановить, перезапустить, обновить или удалить процесс (remove — то же самое, что и на передней панели). Также можно получить доступ к файлу конфигурации, config.
Кнопка confg просмотрит массив аргументов и спросит, тот ли это файл конфигурации, который вы хотите отредактировать. На панели откроется простейший редактор с содержимым файла конфигурации. Редактор ожидает, что вы зададите конфигурацию в JSON. Конфигурация будет обновляться только с помощью разбираемого JSON. JSON будет виден в поле слева.
Чтобы увидеть всю страницу, вам нужно попробовать примеры.
Взгляд на примеры приложений
Вот две тестовые программы, которыми может управлять copious-transitions-manager.
В следующем примере test2.js — это процесс, который получает значения из канала связи, а test3.js записывает значения в канал связи. Видно, что test2.js вызывает messenger.get_on_path, а test3.js вызывает messenger.set_on_path.
test2.js
const {IPCChildClient} = require('message-relay-services')
const {load_json_file} = require('../lib/utils')
const {XXHash32} = require('xxhash32-node-cmake')
console.log("TEST 3 STARTS")
let hasher = new XXHash32(9347597)
let conf = load_json_file(process.argv[2])
if ( conf === undefined ) process.exit(0)
let messenger = new IPCChildClient(conf)
console.log("THIS IS TEST 2")
let any_old_key = [
"this is a key for this is a test",
"another key 94r9w487r you should know tests when you see them",
"more keys are as much fun as testing lots of junk"
]
setInterval(async () => {
let the_time = new Date()
let time_report = the_time.toLocaleString()
//
let rand_pick = Math.trunc(Math.random()*(any_old_key.length - 1))
let txt = any_old_key[rand_pick]
let hash = hasher.hash(txt)
//
let status = await messenger.get_on_path({
"table" : "key_value",
"hash" : hash
},"test2")
//
console.log(status)
//
console.log("test2: One more tick: " + time_report)
},2000)
test3.js
//
const {IPCChildClient} = require('message-relay-services')
const {load_json_file} = require('../lib/utils')
const {XXHash32} = require('xxhash32-node-cmake')
console.log("TEST 3 STARTS")
let hasher = new XXHash32(9347597)
let conf = load_json_file(process.argv[2])
if ( conf === undefined ) process.exit(0)
let messenger = new IPCChildClient(conf)
let any_old_key = [
"this is a key for this is a test",
"another key 94r9w487r key for testing tests",
"more keys are as much fun as testing lots of tests"
]
let things_to_send = [
"this is a test",
"you should know tests when you see them - right?",
"have fun testing lots of test with more tests"
]
setInterval(async () => {
//
let the_time = new Date()
let time_report = the_time.toLocaleString()
//
let rand_pick = Math.trunc(Math.random()*(any_old_key.length - 1))
let txt = any_old_key[rand_pick]
let hash = hasher.hash(txt)
//
let status = await messenger.set_on_path({
"table" : "key_value",
"hash" : hash,
"v" : things_to_send[rand_pick]
},"test2")
//
console.log(status)
//
console.log("test3: One more tick: " + time_report)
},2000)
проверить
Вы можете запустить их с веб-страницы и увидеть сообщения, которые они печатают в панели stdout.
Позже, гипотетически, вы можете использовать другой класс из message-relay-services и более сложный сервер для запуска тех же программ. Все, что вам нужно сделать, это изменить класс в строке require:
const {IPCChildClient} = require('message-relay-services')
Например:
const {MessageRelayer} = require('message-relay-services')
Если сервер конечной точки, к которому подключаются программы, обеспечивает соответствующую функциональность хэш-таблицы, программам не придется больше ничего менять.
Проблемы?
проблемы на github
зависимости
Веб-страница была разработана в Svelte. Найдите проект в директории manager-app.
Спасибо от copious.world