go語言syscall.Exec的用法

go語言syscall.Exec的用法

背景

在docker應用開發(fā)的時候,我們經??吹絚ontainer的啟動腳本docker-entrypoint.sh的最后一句話會是”exec $@“, 這句話有什么意義呢?

shell里面的exec

exec會執(zhí)行參數(shù)指定的命令,但是并不創(chuàng)建新的進程,只在當前進程空間內執(zhí)行,即替換當前進程的執(zhí)行內容,他們重用同一個進程號PID。

go語言syscall.Exec完成同樣的功能

package main

import "time"
import "syscall"
import "os"
import "os/exec"

func main() {

    binary, err := exec.LookPath("sleep")
    if err != nil {
        panic(err)
    }

    args := []string{"sleep", "10"}

    env := os.Environ()

    time.Sleep(10 * time.Second)

    if err := syscall.Exec(binary, args, env); err != nil {
        panic(err)
    }
}

syscall.Exec需要三個參數(shù):

  1. 第一個參數(shù)是可執(zhí)行文件的路徑,注意不會自動從PATH下面去搜索,所以:
    1.1 要么是顯式的指定全路徑:/path/to/executable
    1.2 要么是顯式的指定相對路徑: ./relpath/to/executable
    1.3 要么通過exec.LookPath從PATH里面搜索出來,如本例子。
  2. 第二個參數(shù)是參數(shù)列表
    2.1 注意args[0]是可執(zhí)行程序名,這個內容會顯示在ps -ef的輸出中。用戶可以改這個值,例如明明執(zhí)行的是/usr/bin/sleep的可執(zhí)行程序,但是這里可以改成任意字符串,例如ls,這樣用戶在ps -ef查看到的就是ls的命令在運行,而不是sleep命令,混淆用戶。
    2.2 后面是正常的參數(shù)。
  3. 第三個參數(shù)是環(huán)境變量
    3.1 如果沒有傳,那么不會自動繼承caller的環(huán)境變量的。

所以syscall.Exec只能是main函數(shù)的最后一條指令,它后面的代碼不會被執(zhí)行到。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容