Запустить интерактивный сценарий оболочки в программе golang
Я хочу запустить интерактивный сценарий 9X_go оболочки в программе golang, например, оберните 9X_go-language «ping 8.8.8.8», «python», «bc», «mysql -H 9X_go-language -P -u -p». Программа golang должна завершиться, когда 9X_golang сама завершит вызов интерактивной команды 9X_golang или оболочки и оставит порожденную интерактивную 9X_go с пользователем.
Я пробовал "exec.Command 9X_golang (" python "). Run()", но программа golang 9X_golang просто завершила работу и ничего мне не 9X_go оставила.
func (h ConnectHandler)ConnectMySQL() {
logrus.Debug("ConnectMySQL, script:",common.CONF.FilePath.MySQLConnectScriptPath)
err :=exec.Command("bash",common.CONF.FilePath.MySQLConnectScriptPath).Run()
if err != nil{
logrus.Errorf("ConnectMySQL failed, exit 1,%s",err)
os.Exit(1)
}
}
Ответ #1
Ответ на вопрос: Запустить интерактивный сценарий оболочки в программе golang
Подключите команды stdin, stdout и stderr 9X_go-language к таковым родительского процесса. Кроме 9X_go-language того, укажите -c
в exec.Command
в bash
, иначе bash
попытается 9X_go-language запустить вашу программу, как если бы это 9X_go-language сценарий оболочки.
Например, запуск интерактивной 9X_go консоли Python:
func main() {
fmt.Println("Before Python shell:")
cmd := exec.Command("bash", "-c", "/usr/bin/python3")
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
_ = cmd.Run() // add error checking
fmt.Println("After Python shell")
}
- Этот метод работает отлично. Я не понимаю, почему он не получил голосов.<p><s ...
Ответ #2
Ответ на вопрос: Запустить интерактивный сценарий оболочки в программе golang
Похоже, вы хотите заменить текущий процесс 9X_go командой, которую пытаетесь запустить. После 9X_go того, как вы запустите другую команду, ваша 9X_go программа Go исчезнет, и вызывающий абонент 9X_go будет взаимодействовать с запущенной программой, как 9X_go-language если бы она была изначально запущена.
Для 9X_go-language этого вам понадобится низкоуровневая функция 9X_golang syscall.Exec. Обычно не стоит ожидать его возвращения. Обратите 9X_go-language внимание, что вам необходимо предоставить 9X_golang ряд деталей, таких как фактический исполняемый 9X_go-language двоичный файл и среда, которая не нужна 9X_go оболочкам более высокого уровня. (Очень 9X_golang быстрый поиск в Google находит this detailed writeup.)
import "os"
import "syscall"
err := syscall.Exec("/bin/ls", []string{"ls", "-l", "/"}, os.Environ())
// We don't expect this to ever return; if it does something is really wrong
os.panic(err)
С точки 9X_go-language зрения базовых системных вызовов Unix, интерфейсы 9X_go более высокого уровня, такие как os.StartProcess
и exec.Cmd
, все 9X_go fork (2) являются дочерними процессами сначала 9X_golang перед execve (2) в этом ребенке. Когда ваш процесс 9X_go Go завершается, этот дочерний процесс становится 9X_go-language осиротевшим, а системный процесс инициализации становится 9X_go-language его новым родительским. Оболочка просто 9X_go видит, что процесс Go завершился, и выдает 9X_go-language новое приглашение оболочки.
- В моем ответе нет «родительского процесса»; программа Go заменяется программой exec'd, а идентификатор родителя и процесса такие же, как и для программы ...
-
10
-
2
-
5
-
23
-
4
-
15
-
1
-
10
-
9
-
5
-
5
-
7
-
14
-
2
-
10
-
6
-
9
-
6
-
5
-
8
-
6
-
3
-
11
-
1
-
2
-
1
-
2
-
2
-
4
-
11
-
5
-
4
-
2
-
2
-
6
-
5
-
9
-
6
-
5
-
2
-
4
-
12
-
4
-
2
-
5
-
6
-
4
-
2
-
3
-
5