在背景運行進程

在背景運行進程

關於在後台啟動進程,我有兩個問題:

  1. 為什麼要在背景啟動一個進程,如下所示:

    ./my_program &

    my_program當然有 exe 權限集)不會讓 bash 像任何其他命令一樣列印命令提示字元嗎?它只是留下了一個空的新行,遊標閃爍。

  2. 當我在後台運行下一個新進程時,bash 顯示某事。像那樣:

    ./my_program & [30] 1439 [27] Done ./my_program [28] Done ./my_program [29] Done ./my_program

    這是否意味著在後台啟動另一個額外進程會使系統顯示有關預覽進程([27], [28], [29] 行)的信息,只要當前啟動)([30]行)?

答案1

  1. 這不應該發生。當您在背景執行命令時,bash 通常只會列印作業號碼和 pid(請參閱下文),然後返回命令提示字元。

    我知道導致 bash 在這種情況下給你留下一個新行的唯一原因是如果你的命令實際上不存在,因為它會在打印 PS1 後以某種方式給出錯誤訊息:

    $ nonexistant_command &
    [1] 13856
    $
    nonexistant_command: command not found
    <empty line with blinking cursor here>
    

    無論原因是什麼,在此空行上按 Enter 鍵應該會列印一個新行,並帶有您通常的提示(並且可能會顯示您剛剛產生的作業已完成的訊息;請參見下文)。

  2. 您看到的附加輸出是 bash,告訴您目前的後台作業:

    首先,它告訴您任何新建立的後台程序的目前作業號及其 pid,如下所示:

    $ some_command &
    [1] 1234
    

    這表示該命令some_command現在正在使用 pid 1234 作為作業 1 運行。

    後台作業完成後,bash 會在下次列印命令提示字元時透過列印像這樣的訊息:

    [1]  Done                    some_command
    

    這表示執行的編號為 1 的作業some_command現已完成。

    要了解 bash 目前正在追蹤哪些後台作業,您可以使用jobs內建函數,如下所示:

    $ jobs
    [1]  Running                 some_command &
    [2]  Running                 some_other_command &
    

    若要將作業帶到前台,您可以使用fg

    $ fg 2
    some_other_command
    

    有關這方面的更多信息,請嘗試help jobs

相關內容