歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux技巧:讓進程在後台可靠運行的幾種方法

Linux技巧:讓進程在後台可靠運行的幾種方法

日期:2017/2/25 10:39:10   编辑:Linux教程
  想讓進程在斷開連接後依然保持運行?如果該進程已經開始運行了該如何補救? 如果有大量這類需求如何簡化操作?
  我們經常會碰到這樣的問題,用 telnet/ssh 登錄了遠程的 Linux 服務器,運行了一些耗時較長的任務, 結果卻由於網絡的不穩定導致任務中途失敗。如何讓命令提交後不受本地關閉終端窗口/網絡斷開連接的干擾呢?下面舉了一些例子, 您可以針對不同的場景選擇不同的方式來處理這個問題。
  nohup/setsid/&
  場景:
  如果只是臨時有一個命令需要長時間運行,什麼方法能最簡便的保證它在後台穩定運行呢?
  解決方法:
  我們知道,當用戶注銷為1為1(init 進程的 PID),並不是當前終端的進程 ID。因此並不屬於當前終端的子進程,從而也就不會受到當前終端的 HUP 信號的影響了。
  disown
  場景:
  我們已經知道,如果事先在命令前加上 nohup 或者 setsid 就可以避免 HUP 信號的影響。但是如果我們未加任何處理就已經提交了命令,該如何補救才能讓它避免 HUP 信號的影響呢?
  解決方法:
  這時想加 nohup 或者 setsid 已經為時已晚,只能通過作業調度和 disown 來解決這個問題了。讓我們來看一下 disown 的幫助信息:
  disown [-ar] [-h] [jobspec ...]Without options, each jobspec isremovedfromthetableofactivejobs. Ifthe -h option is given, each jobspec is notremoved from the table, but is marked sothatSIGHUPisnotsentto the job if the shell receives a SIGHUP.If no jobspecis present, and neither the -a nor the -r optionissupplied,thecurrentjobisused.If no jobspec is supplied, the -aoption means to remove or mark all jobs; the -r optionwithoutajobspecargumentrestricts operation to running jobs.Thereturn value is 0 unless a jobspec doesnotspecifyavalidjob.
  可以看出,我們可以用如下方式來達成我們的目的。
  用disown -h jobspec 來使某個作業忽略HUP信號。 用disown -ah 來使所有的作業都忽略HUP信號。 用disown -rh 來使正在運行的作業忽略HUP信號
  需要注意的是,當使用過 disown 之後,會將把目標作業從作業列表中移除,我們將不能再使用jobs來查看它,但是依然能夠用ps -ef查找到它。
  但是還有一個問題,這種方法的操作對象是作業,如果我們在運行命令時在結尾加了"&"來使它成為一個作業並在後台運行,那麼就萬事大吉了,我們可以通過jobs命令來得到所有作業的列表。但是如果並沒有把當前命令作為作業來運行,如何才能得到它的作業號呢?答案就是用 CTRL-z(按住Ctrl鍵的同時按住z鍵)了!
  CTRL-z 的用途就是將當前進程掛起(Suspend),然後我們就可以用jobs命令來查詢它的作業號,再用bg jobspec 來將它放入後台並繼續運行。需要注意的是,如果掛起會影響當前進程的運行結果,請慎用此方法。
  靈活運用 CTRL-z在我們的日常工作中,我們可以用 CTRL-z 來將當前進程掛起到後台暫停運行,執行一些別的操作,然後再用 fg 來將掛起的進程重新放回前台(也可用 bg 來將掛起的進程放在後台)繼續運行。這樣我們就可以在一個終端內靈活切換運行多個任務,這一點在調試代碼時尤為有用。因為將代碼編輯器掛起到後台再重新放回時,光標定位仍然停留在上次掛起時的位置,避免了重新定位的麻煩。
  disown 示例1(如果提交命令時已經用“&”將命令放入後台運行,則可以直接使用“disown”)
  [root@pvcent107 build]# cp -r testLargeFile largeFile & 4825[root@pvcent107 build]# jobs+ Running cp -i -r testLargeFile largeFile &[root@pvcent107 build]# disown -h %1[root@pvcent107 build]# ps -ef
Copyright © Linux教程網 All Rights Reserved