рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреЛ рдкрд░ рдПрдХ рд╡реЗрдм рдЯрд░реНрдорд┐рдирд▓ рдПрдореБрд▓реЗрдЯрд░ рд▓рд┐рдЦрдирд╛

рд╣рдо рдХреНрдпрд╛ рд▓рд┐рдЦреЗрдВрдЧреЗ


рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ PHP рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯрд░реНрдорд┐рдирд▓ рдПрдореБрд▓реЗрдЯрд░ рд▓рд┐рдЦрд╛ рдерд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдм рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдкрд░ рдХреБрдЫ рдФрд░ рдЧрдВрднреАрд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рд╡реЗрдм рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ ..? рдЕрдЬрдЧрд░ ..? рд░реВрдмреА ..? рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ ..? рдирд╣реАрдВ! рдЪреВрдВрдХрд┐ рдЧреЛ 1 рдЖрдпрд╛ рд╣реИ, рдЪрд▓реЛ рдЙрд╕ рдкрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ;)ред рдореИрдВ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдореИрдВ рдЦреБрдж рдХреЛ рди рджреЛрд╣рд░рд╛рдКрдВ рдФрд░ рдпрд╣рд╛рдВ рдкреВрд░рд╛ рдХреЛрдб рди рд▓рд┐рдЦреВрдВред рдореИрдВ рдХреЗрд╡рд▓ рджрд┐рд▓рдЪрд╕реНрдк, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЯреБрдХрдбрд╝реЗ рджреЗрдЧрд╛ред

рдбреЗрдореЛ


рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдЯрд░реНрдорд┐рдирд▓ рдПрдореБрд▓реЗрдЯрд░ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдЕрд╡рд╕рд░ рдХреЗ рд▓рд┐рдП Aleks_ja рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж (рдЖрдкрдХреЛ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ 11 рдпрд╛ рдирд╡реАрдирддрдо рдХреНрд░реЛрдо)ред рдкрд╣рд▓реА рдмрд╛рд░ рдпрд╣ рдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рдбреЗрдореЙрди рдХреЛ 100 рдПрдордПрд╕ рдореЗрдВ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИ - рдкрд╣рд▓реЗ рдкреГрд╖реНрда рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред



рд╡реЗрдм рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рд▓рд┐рдП рд╕реЛрд░реНрд╕ рдХреЛрдб рдЬреАрдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдбреЗрдореЙрди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ( go build ) - рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдЙрдкрд╛рдп рд╣реИ рдЬреЛ "рджрд░рд╛рд░" рд╣реЛрд╕реНрдЯрд░реНрд╕ рдХреЛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ;)ред

рд╕рд╛рдордЧреНрд░реА


рддреЛ, рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:



рдПрдХ рд╡реЗрдм рджрд╛рдирд╡ рд╕реЙрдХреЗрдЯ рд▓реЗрдЦрди


рд╣рдорд╛рд░реЗ рдбреЗрдореЙрди рдореЗрдВ, рдПрдХ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рд╕рд░реНрд╡рд░ рдФрд░ рдПрдХ рдЫрджреНрдо рдЯрд░реНрдорд┐рдирд▓ рдПрдореНрдпреВрд▓реЗрдЯрд░ рд╕рдВрдпреБрдХреНрдд рд╣реЛрдЧрд╛ред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЧреЛ рдореЗрдВ рдЫрджреНрдо рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдореВрд▓ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ, рдпрд╣ рднрд╛рд╖рд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реА рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реА рдореЗрдВ рдЗрд╕реА рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реАрдзреЗ рдЫрджреНрдо рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред

рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ

 package main import ( "code.google.com/p/go.net/websocket" "http" "log" ) //  -  func PtyServer(ws *websocket.Conn) { // ws тАФ     *websocket.Conn,  //   Read()  Write()  /   } func main() { http.Handle("/ws", websocket.Handler(PtyServer)) //    "/ws"   log.Fatal(http.ListenAndServe(":12345", nil)) //    12345 } 


рдЫрджреНрдо рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ

рд╣рдо forkpty () рдФрд░ ioctl () рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд▓рд┐рдЦреЗрдВрдЧреЗ (ioctl () рдореЗрдВ рд╣рдо рдЯрд░реНрдорд┐рдирд▓ рдХреЗ "рд╡рд┐рдВрдбреЛ" рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗ): рдЬрд╛рдУ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ C рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдПрдХреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ pp_t рдФрд░ int рдПрдХ рд╣реА рдмрд╛рдд рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╕реА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ред

 package main /* #cgo LDFLAGS: -lutil #include <stdlib.h> #include <sys/ioctl.h> #...     ... int goForkpty(int *amaster, struct winsize *winp) { return forkpty(amaster, NULL, NULL, winp); } int goChangeWinsz(int fd, struct winsize *winp) { return ioctl(fd, TIOCSWINSZ, winp); } */ import "C" 


рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

 func PtyServer(ws *websocket.Conn) { cols, rows := 80, 24 //    - int var winsz = new(C.struct_winsize) //    "var name = ..." тАФ     winsz.ws_row = C.ushort(rows); //         winsz.ws_col = C.ushort(cols); winsz.ws_xpixel = C.ushort(cols * 9); winsz.ws_ypixel = C.ushort(rows * 16); cpttyno := C.int(-1) pid := int(C.goForkpty(&cpttyno, winsz)) pttyno := int(cpttyno) // ... } 


рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдФрд░ рдЫрджреНрдо рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░

рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрдмрдВрдзрд┐рдд рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ (рдкреЛрдЗрдЯреНрдиреЛ) рд╕реЗ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рднреЗрдЬрдирд╛, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╡реЗрдм рд╕реЙрдХреЗрдЯ рд╕реЗ рдЗрдирдкреБрдЯ рдкреЙрдЗрдЯреНрдиреЛ рддрдХ рдЗрдирдкреБрдЯ рднреЗрдЬрдирд╛ рд╕рд░рд▓ рд╣реИред рд╕рдорд╕реНрдпрд╛ рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдЬрдм рдПрдХ рдЕрдкреВрд░реНрдг рдпреВрдЯреАрдПрдл -8 рдЕрдиреБрдХреНрд░рдо рд╣рдореЗрдВ рдЫрджреНрдо рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рдЖрддрд╛ рд╣реИред рд╣рдо рдЫрджреНрдо рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рдХреЗрд╡рд▓ рдмреНрд▓реЙрдХреЛрдВ (рдХрд╣реЛ, 2 KB) рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмреНрд▓реЙрдХ рдХрд╛ рдЕрдВрдд UTF-8 рд╡рд░реНрдг рдХреЛ 2 рднрд╛рдЧреЛрдВ рдореЗрдВ "рдХрд╛рдЯ" рд╕рдХрддрд╛ рд╣реИ - рдпрд╣ "рдЯреНрд░рд┐рдо" рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдЧрд╛ред рдпрд╣рд╛рдБ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдХреЛрдб рд╣реИ рдЬреЛ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ:

 for end = buflen - 1; end >= 0; end-- { //    Go    if utf8.RuneStart(buf[end]) { //    ... ch, width := utf8.DecodeRune(buf[end:buflen]) if ch != utf8.RuneError { end += width } break } } 


рд╣рдореЗрдВ рдмрдлрд╝рд░ (buf) рдХреЗ рдЕрдВрдд рдореЗрдВ рдмрд╛рдЗрдЯ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ UTF-8 рдХреИрд░реЗрдХреНрдЯрд░ (рдЧреЛ рд╢рдмреНрджрд╛рд╡рд▓реА - рд░рди) рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХреИрд░реЗрдХреНрдЯрд░ рдмрд░рдХрд░рд╛рд░ рд╣реИред рдпрджрд┐ рдЕрдВрддрд┐рдо рд╡рд░реНрдг рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рддреЛ рд╣рдо рдмрдлрд░ рдХреЗ "рдЕрдВрдд" рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдмрдлрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░ рджреЗрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХреЗрд╡рд▓ рдкреВрд░реЗ рдкрд╛рддреНрд░ рд╣реА рд░рд╣реЗрдВред

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЫрджреНрдо рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП JSLinux рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд▓реЗрдЦрдХ рдореЗрд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдХреЛрдб рдХреЗ рд╕рдВрд╢реЛрдзрди рдФрд░ рд╡рд┐рддрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдЗрдП Selectel рд╕реЗ рдореЗрд░реЗ рджреЛрд╕реНрддреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреА рдЧрдИ рд╕реЗрд▓реЗрдХреНрдЯ / pyte рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓реЗ рд▓реЛ ... рдПрдХ рдорд┐рдирдЯ рд░реБрдХреЛ, рдпрд╣ рдЕрдЬрдЧрд░ рд╣реИ :(!) рдПрдХ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмреЗрдХрд╛рд░ рд╣реИ, рдЪрд▓реЛ! рд╣рдо рдЗрд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВрдЧреЗ :)! рдЕрдЬрдЧрд░ рд╕реЗ рдмрдВрджрд░рдЧрд╛рд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЕрдЬрдЧрд░ рдХрд╛ рд╡рд┐рд╢реЗрд╖ рдкрд╛рд░рдЦреА рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдорд┐рдбрдирд╛рдЗрдЯ рдХрдорд╛рдВрдбрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрднреА рднреА JSLinux рдХреЗ рд▓реЗрдЦрдХ рд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЛрдб рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдореИрдВрдиреЗ рдиреАрдЪреЗ рдЗрдирдкреБрдЯ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреБрдЫ рдкрд╛рда рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рдЬреЛрдбрд╝реА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рд╕рд╡рд░реНрдб) рдФрд░ F1 - F12 рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдкрд┐рдВрдЧ рдФрд░ рд╕рд╛рде рд╣реА Alt + (рдмрд╛рдПрдБ / рджрд╛рдПрдБ рддреАрд░) рдХреЗ рд▓рд┐рдП рдореИрдкрд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдПрдл-рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рд╡рд░реНрдгреЛрдВ рдХрд╛ рдорд╛рди рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ $ TERM рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ vt100 рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ VT100 рдореЗрдВ рдХреАрдмреЛрд░реНрдб рдкрд░ рдирд╣реАрдВ рдереЗ :)ред рдЪреВрдБрдХрд┐ pyte рдХрд╛ рдкреНрд░рдпреЛрдЧ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, $ TERM рдХрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░ linux рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рд▓рд┐рдП рдЗрди рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рд╣рдордиреЗ "рдСрди рдбрд┐рдорд╛рдВрдб" рджрд╛рдирд╡ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛


рдореИрдВрдиреЗ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдбреЗрдореЙрди рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдЕрдВрддрд┐рдо рдХрдиреЗрдХреНрд╢рди рдХреЗ рдПрдХ рдорд┐рдирдЯ рдмрд╛рдж рдмрд╛рд╣рд░ рдЖрдП, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡реЗрдм рдЯрд░реНрдорд┐рдирд▓ рд╕реЙрдХреЗрдЯ рдбреЗрдорди рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ рдЬрдм рд╣рдо рдкреГрд╖реНрда рдХреЛ рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рд╕рд╛рде рдЦреЛрд▓рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП PHP рдХреЛрдб рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
 <?php $PORT = 13923; // port terminal daemon will be run at system('exec nohup ./ws '.$PORT.' </dev/null >>ws.log 2>&1 &'); 


рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ exec рдХреНрдпрд╛ exec , рддреЛ рдореИрдВ exec : рдпрд╣ рдХрд┐рд╕реА рднреА рдпреВрдирд┐рдХреНрд╕ рд╢реЗрд▓ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрдорд╛рдВрдб рд╣реИ рдЬреЛ рд╢реЗрд▓ рдХреЛ рд╕реНрд╡рдпрдВ рдХреЛ рддрдерд╛рдХрдерд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ "рд╕реБрдкрд░рдлреНрд▓реБрдЕрд╕" рдкреНрд░рдХреНрд░рд┐рдпрд╛ sh -c ./ws ...

рдЬрд┐рди рдкрд▓реЛрдВ рдХреА рдореИрдВрдиреЗ рдмрд╛рдд рдирд╣реАрдВ рдХреА


рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХреА:


рдЧрд┐рдердм рдкрд░рд┐рдпреЛрдЬрдирд╛


рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЧреАрдердм рдХреЗ рд▓рд┐рдВрдХ рджреЛрд╣рд░рд╛рдКрдВрдЧрд╛:
github.com/YuriyNasretdinov/WebTerm - рдЯрд░реНрдорд┐рдирд▓ рдПрдореБрд▓реЗрдЯрд░, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рд▓реЗрдЦ рдореЗрдВ рдмрд╛рдд рдХреА рдереА
github.com/YuriyNasretdinov/pyte - рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЪрдпрдирдХрд░реНрддрд╛ / pyte рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдореЗрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ)

Source: https://habr.com/ru/post/In141068/


All Articles