我真不知道在後台運行應用程式有什麼好處。就像透過命令列
一樣。Application &
我們到底為什麼要在後台運行應用程式?
答案1
通常,執行時間過長且不需要使用者互動的應用程式會被傳送到後台,以便我們可以在終端機中繼續工作。
在背景執行的作業與在前台執行的作業的處理方式相同,只是它們的 STDOUT、STDIN 和 STDERR 有所不同。
如果您的作業需要很長時間,例如檔案壓縮或備份,您可以將這些作業傳送到背景。
jobs
您可以使用指令列出在背景執行的作業。
$ ./job1.sh &
[1] 9747
$ ./job2.sh &
[2] 9749
$ ./job3.sh &
[3] 9751
$ jobs
[1] Running ./job1.sh &
[2]- Running ./job2.sh &
[3]+ Running ./job3.sh &
每當作業傳送到背景 shell 時,都會在此處顯示進程的job id
和。pid
如果我們希望進程返回前台,我們可以使用fg
命令將其恢復。
$ fg 1
./job1.sh
但請注意,當您關閉終端機 (shell) 時,SIGHUP 將被傳送到從 shell 產生的所有背景進程,導致這些進程死亡。為了防止這種情況,您可以使用disown
命令從作業表中刪除這些進程,從而防止進程被殺死。
最好的方法是使用命令啟動後台進程,nohup
這樣 SIGHUP 訊號就不會終止該進程,並且它將在後台安全運行。
huponexit
也可以透過設定bash shell 的選項來防止將 SIGHUP 傳送到子程序(bg 作業) 。
$ shopt -s huponexit
在最新版本的 Bash 中預設設定此選項,但如果未設置,我們可以新增此選項~/.bashrc
以使其成為預設行為。
答案2
如果您執行一個需要 5 分鐘才能結束的應用程序,例如複製作業,那麼 shell 在程式運行時會被阻塞,整整 5 分鐘。然後,複製作業位於所謂的前台進程組中,由登入+
指示ps
。在那 5 分鐘內您可能需要做一些其他工作,但 shell 被封鎖了。
另一方面,當您在背景執行複製作業 ( cp source target &
) 時,您的作業將在背景執行,而不會阻塞目前 shell。你可以繼續做其他事情。fg
如果您願意,可以將進程帶回前台。