Як повністю вбити дочірній процес

Маю найпростіший код, який просто протягом 5/3 секунд виводить числа.

В іншій програмі я в циклі запускаю "go run first.go%", де i - просто індекс циклу і чекаю завершення процесу. Але за секунду після запуску я вбиваю процес (cmd.Process.Kill()). cmd.Wait() розблоковується, процес вважається вбитим, цикл починається спочатку. Ось тільки числа продовжують виводитись до кінця роботи програми (5/3 секунди). Як таке можливо, що процес начебто вбитий, але при цьому продовжує працювати?

Є підозра, що я вбиваю go, а ось дочірній процес (бінарник, скомпільований go) відходить до init, потім закінчує свою дію та вмирає. Тоді потрібно або збирати самому і запускати бінарник, або дізнатися, як убити go разом із запущеним бінарником.

go run має особливості, наприклад, ви можете запустити його в консолі і забути - від консолі він спокійно відв'яжеться. Тут у вас схожа ситуація. Якщо ви хочете запускати якийсь код у "дочірньому" процесі, то робіть це явно: 1. через fork() - що не бажано 2. через go-рутини 3. . Але, зважаючи на все, ви намагаєтеся схрестити Golang додаток з додатком іншою мовою (інакше звідки такі проблеми). У такому разі вам потрібно: 1. навчити програму (first.go) розуміти сигнали операційної системи, для цього вивчіть os.Signal і syscall.SIGKILL (взагалі почитайте на тему які сигнали треба обробляти при завершенні програми) і завершуйте програму правильно в потрібний момент 2. все ж таки скомпілюйте спочатку в бінарник, go install first.go і використовуйте вже саме його.

Ну і насамкінець - не треба так витрачати ресурси - запускати N раз іншу програму щоб просто порахувати кілька однотипних цифр. Сформуйтепрограму більш ємно, відправте їй купу даних і отримайте від неї іншу купу результатів разом. Або зробіть багатопотоковий сервіс, який приймає запити і видає відповіді.