Запустите исполняемый файл сервера на порт в Windows, используя golang - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь запустить несколько серверов на разных портах на моей машине с Windows, используя golang.Это для внутреннего тестирования.

Таким образом, конечным результатом будет наличие исполняемого файла, который будет запускать несколько экземпляров моего сервера (еще один исполняемый файл Windows) на нескольких портах.Мой идеальный подход - использовать подпрограммы "n" go, которые запускают команду "myserver.exe. \ Config.json port + n" на портах в диапазоне от "порт + 0" до "порт + n", чтобы я мог иметь "n "серверы запущены и работают.Я придумываю способ запустить свой сервер и продолжать слушать, пока не хочу, чтобы программа закончилась.

У меня есть сервер в качестве исполняемого файла Windows, который обслуживает порт, указанный при его запуске.Он работает нормально, когда я запускаю его вручную.Его можно запустить как:

C:\Install\myServer.exe C:\Install\Configuration.json 8079 

Приведенная выше команда запускает сервер и прослушивает порт 8079. Я хотел бы запустить несколько экземпляров одного и того же сервера на разных портах.Код, который я написал после программы golang, не работает на службах Windows и https://github.com/kardianos/service ниже.Я вижу, что команда для запуска моего сервера была выполнена, но я не вижу никаких служб, когда открываю services.msc, ни когда я выполняю команду powershell get-service.Я также пытался узнать, могу ли я прослушивать порт 8079 (в данном случае) после запуска через программу go, чтобы узнать, получу ли я какой-либо ответ, но получаю следующую ошибку:

panic: Get http://localhost:8079/config: dial tcp [::1]:8079: connectex: No connection could be made because the targetmachine actively refused it.

Ниже приводитсякод:

var logger service.Logger

type program struct{}

func (p *program) Start(s service.Service) error {
    // Start should not block. Do the actual work async.
    go p.run()
    return nil
}
func (p *program) run() {
    /*// Do work here
    // the following sleep-print was used for testing if this method is actually being executed and it worked. 
    fmt.Println("Waiting")
    time.Sleep(3 * time.Second)
    fmt.Println("waited")
    */
    command := "C:\\Install\\myServer.exe C:\\Install\\Configuration.json "+ flag.Arg(0) 
    fmt.Println("Creating the command", command)
    c := exec.Command("cmd", command )

    var outb, errb bytes.Buffer
    c.Stdout = &outb
    c.Stderr = &errb

    fmt.Println("Starting the command")
    if err := c.Run(); err != nil { 
        fmt.Println("Error: ", err)
    }else{
        fmt.Println("out:", outb.String(), "err:", errb.String())
    }
    fmt.Println("After run issued")
    //
}
func (p *program) Stop(s service.Service) error {
    // Stop should not block. Return with a few seconds.
    return nil
}

func main() {
    flag.Parse() // get the source and destination directory

    svcConfig := &service.Config{
        Name:        "GoServiceExampleSimple",
        DisplayName: "Go Service Example",
        Description: "This is an example Go service.",
    }

    fmt.Printf("%v+", svcConfig)

    prg := &program{}
    s, err := service.New(prg, svcConfig)
    if err != nil {
        fmt.Println(err)
    }
    logger, err = s.Logger(nil)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println("Main Run")
    err = s.Run()
    fmt.Println("After Main Run")
    if err != nil {
        logger.Error(err)
    }
}

Вывод вышеуказанного кода:

Main Run
Creating the command C:\Install\myServer.exe C:\Install\Configuration.json 8079
Starting the command
out: Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

Заранее спасибо :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...