linux状态下开发后台,使程序在Linux下后台運行,程序運行前后台切換

一、為什么要使程序在后台執行

我們計算的程序都是周期很長的,通常要幾個小時甚至一個星期。我們用的環境是用Xshell遠程連接到Linux服務器。所以使程序在后台跑有以下兩個好處:

1:我們這邊是否關機不影響服務器的程序運行。(不會像以前那樣,我們這網絡一斷開,或一關機,程序就斷掉或找不到數據,跑了幾天的程序只能重頭再來,很是煩惱)

2:讓程序在后台跑后,不會占據終端,我們可以用終端做別的事情。

二、怎么樣使程序在后台執行

方法有很多,這里主要列舉兩種。假如我們有程序pso.cpp,通過編譯后產生可執行文件pso,我們要使pso在linux服務器后台執行。當客戶端關機后重新登入服務器后繼續查看本來在終端輸出的運行結果。(假設操作都在當前目錄下)

方法1. 在終端輸入命令:

./pso > pso.file 2>&1 &

解釋:將pso直接放在后台運行,並把終端輸出存放在當前目錄下的pso.file文件中。

當客戶端關機后重新登陸服務器后,直接查看pso.file文件就可看執行結果

cat pso.file

這種方法有時候關閉終端也會導致程序中斷,有另一種更保險的方法,如下:

方法2. 在終端輸入命令:

nohup ./pso > pso.file 2>&1 &

解釋:nohup就是不掛起的意思,將pso直接放在后台運行,並把終端輸出存放在當前目錄下的pso.file文件中。當客戶端關機后重新登陸服務器后,直接查看pso.file

cat pso.file

三、常用任務管理命令

# 查看任務,返回任務編號n和進程號

jobs -l

# 掛起當前任務

ctrl+z

# 將編號為n的任務轉后台運行

bg %n

# 將編號為n的任務轉前台運行

# fg %n

# 結束當前任務

ctrl+c

# 設置程序父進程為1,不中斷

setsid ./test.sh &

# 查看指定任務詳細

ps -ef | grep test

# 顯示當窗口父進程ID

echo $$

注:如果要使在前天執行任務放到后台運行,則先要用ctrl+z掛起該任務,然后用bg %n使之后台執行。

附:操作實例

在Linux中,如果要讓進程在后台運行,一般情況下,我們在命令后面加上&即可,實際上,這樣是將命令放入到一個作業隊列中了:

# 運行任務並放入后台

./test.sh &

# 會顯示如下PID,任務的進程號

# [1] 17208

# 查看當前終端下的任務列表

jobs -l

# 會顯示任務編號,當前還是歷史任務,運行狀態,命令名稱

# [1]+ Running ./test.sh &

前台執行的命令放到后台執行

首先按ctrl+z暫停已經運行的進程,然后使用bg %1 命令將停止的作業放到后台運行:

# 運行一個程序

./test.sh

# Ctrl+z掛起程序並顯示編號

# [1]+ Stopped ./test.sh

# 程序轉后台

bg %1

但是如上方到后台執行的進程,其父進程還是當前終端shell的進程,而一旦父進程退出,則會發送hangup信號給所有子進程,子進程收到hangup以后也會退出。如果我們要在退出shell的時候繼續運行進程,則需要使用nohup忽略hangup信號,或者setsid將將父進程設為init進程(進程號為1)

顯示當前父進程ID

echo $$

# 顯示如:21734

查看指定任務詳細

ps -ef | grep test

運行結果如下:2列為子進展,3列為你進程

515 29710 21734 0 11:47 pts/12 00:00:00 /bin/sh ./test.sh 515 29713 21734 0 11:47 pts/12 00:00:00 grep test

setsid不中斷運行程序,父進程為1

setsid ./test.sh &

[1] 409

ps -ef | grep test

運行結果如下:

515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh 515 413 21734 0 11:49 pts/12 00:00:00 grep test

將己在后台程序不中斷nohup

上面的試驗演示了使用nohup/setsid加上&使進程在后台運行,同時不受當前shell退出的影響。那么對於已經在后台運行的進程,該怎么辦呢?可以使用disown命令:

$./test.sh &

[1] 2539

$jobs -l

[1]+ 2539 Running ./test.sh &

$disown -h %1

$ps -ef | grep test

515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh

515 2542 21734 0 11:52 pts/12 00:00:00 grep test

另外還有一種方法,即使將進程在一個subshell中執行,其實這和setsid異曲同工。方法很簡單,將命令用括號() 括起來即可:

$(./test.sh &)

$ps -ef | grep test

515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh

515 12483 21734 0 11:59 pts/12 00:00:00 grep test

注:本文試驗環境為Red Hat Enterprise Linux AS release 4 (Nahant Update 5), shell為/bin/bash,不同的OS和shell可能命令有些不一樣。例如AIX的ksh,沒有disown,但是可以使用nohup -p PID來獲得disown同樣的效果。

screen的用法

還有一種更加強大的方式是使用screen,首先創建一個斷開模式的虛擬終端,然后用-r選項重新連接這個虛擬終端,在其中執行的任何命令,都能達到nohup的效果,這在有多個命令需要在后台連續執行的時候比較方便:

$ screen -dmS screen_test

$ screen -list

There is a screen on:

27963.screen_test (Detached)

1 Socket in /tmp/uscreens/S-jiangfeng.

$ screen -r screen_test

linux 程序運行前后台切換

A. Shell支持作用控制,有以下命令:

1. command& 讓進程在后台運行

2. jobs 查看后台運行的進程

3. fg %n 讓后台運行的進程n到前台來

4. bg %n 讓進程n到后台去;

PS:”n”為jobs查看到的進程編號.

fg、bg、jobs、&、ctrl + z都是跟系統任務有關的,雖然現在基本上不怎么需要用到這些命令,但學會了也是很實用的。

& 最經常被用到

這個用在一個命令的最后,可以把這個命令放到后台執行

ctrl + z

可以將一個正在前台執行的命令放到后台,並且暫停

jobs

查看當前有多少在后台運行的命令

fg

將后台中的命令調至前台繼續運行

如果后台中有多個命令,可以用 fg %jobnumber將選中的命令調出,%jobnumber是通過jobs命令查到的后台正在執行的命令的序號(不是pid)

bg

將一個在后台暫停的命令,變成繼續執行

如果后台中有多個命令,可以用bg %jobnumber將選中的命令調出,%jobnumber是通過jobs命令查到的后台正在執行的命令的序號(不是pid)

Linux下使用Shell命令控制任務Jobs執行

下列命令可以用來操縱進程任務:

ps 列出系統中正在運行的進程;

kill 發送信號給一個或多個進程(經常用來殺死一個進程);

jobs 列出當前shell環境中已啟動的任務狀態,若未指定jobsid,則顯示所有活動的任務狀態信息;如果報告了一個任務的終止(即任務的狀態被標記為Terminated),shell 從當前的shell環境已知的列表中刪除任務的進程標識;

bg 將進程搬到后台運行(Background);

fg 將進程搬到前台運行(Foreground);

將job轉移到后台運行

如果你經常在X圖形下工作,你可能有這樣的經歷:通過終端命令運行一個GUI程序,GUI界面出來了,但是你的終端還停留在原地,你不能在shell中繼續執行其他命令了,除非將GUI程序關掉。

為了使程序執行后終端還能繼續接受命令,你可以將進程移到后台運行,使用如下命令運行程序: #假設要運行xmms

$xmms &

這樣打開xmms后,終端的提示又回來了。現在xmms在后台運行着呢;但萬一你運行程序時忘記使用“&”了,又不想重新執行;你可以先使用ctrl+z掛起程序,然后敲入bg命令,這樣程序就在后台繼續運行了。

概念:當前任務

如果后台的任務號有2個,[1],[2];如果當第一個后台任務順利執行完畢,第二個后台任務還在執行中時,當前任務便會自動變成后台任務號碼“[2]”的后台任務。所以可以得出一點,即當前任務是會變動的。當用戶輸入“fg”、“bg”和“stop”等命令時,如果不加任何引號,則所變動的均是當前任務。

查看jobs

使用jobs或ps命令可以察看正在執行的jobs。

jobs命令執行的結果,+表示是一個當前的作業,減號表是是一個當前作業之后的一個作業,jobs -l選項可顯示所有任務的PID,jobs的狀態可以是running, stopped, Terminated,但是如果任務被終止了(kill),shell 從當前的shell環境已知的列表中刪除任務的進程標識;也就是說,jobs命令顯示的是當前shell環境中所起的后台正在運行或者被掛起的任務信息;

進程的掛起

后台進程的掛起:

在redhat中,不存在stop命令,可通過執行命令kill -stop PID,將進程掛起;

當要重新執行當前被掛起的任務時,通過bg %num 即可將掛起的job的狀態由stopped改為running,仍在后台執行;當需要改為在前台執行時,執行命令fg %num即可;

猜你喜歡

寫在后面

為鼓勵讀者交流、快速解決科研困難,我們建立了“宏基因組”專業討論群,目前己有國內外1400+ 一線科研人員加入。參與討論,獲得專業解答,歡迎分享此文至朋友圈,並掃碼加主編好友帶你入群,務必備注“姓名-單位-研究方向-職稱/年級”。技術問題尋求幫助,首先閱讀《如何優雅的提問》學習解決問題思路,仍末解決群內討論,問題不私聊,幫助同行。

9edbffde63cf35f38e0168f23f4bbbe2.png

學習擴增子、宏基因組科研思路和分析實戰,關注“宏基因組”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值