一般要在伺服器上做一些花裡胡哨的操作時,都是開啟終端(如果是遠端伺服器,則還需要通過ssh連線下)在上面操作。你會發現當你的ssh斷開或關閉terminal時,你在上面臨時執行的程式也停掉了,這是為什麼呢,今天就來討論下這個問題。
關於終端和shell的來由說起來就話長了,這裡不做贅述,可以看下這篇文章linux cygwin知識庫(一):一文搞清控制台、終端、shell概念
簡單來說:terminal是幫你輸入和顯示命令結果的,shell是幫你執行命令的。
從程序會話的角度來說,它們的包含關係如下:
a.out是乙個示例程式:
main()
;}
gcc編譯後,把它執行起來,看下它的pid,ppid,gid,sid
# pidof a.out
28505
# ps -c a.out -o pid,ppid,gid,sid
pid ppid gid sid
28505 28266 0 28266
可以看到ppid和sid是同乙個,是bash
# ps aux | grep 28266
root 28266 0.0 0.0 22872 5436 pts/0 ss 14:37 0:00 -bash
再看下bash的ppid,以及它對應的程序,可以看到是sshd(我這裡是通過ssh連線操作的伺服器)
# ps -ef | grep bash
root 28266 28165 0 14:37 pts/0 00:00:00 -bash
# ps -ef | grep 28165
root 28165 1354 0 14:37 ? 00:00:00 sshd: root@pts/0
當關閉a.out的終端時可以看到a.out也沒有執行了,而現實的場景中肯定會遇到要守護程序的方式,即終端關掉以後程式可以繼續執行。在linux下常見的有daemon,systemed,nohup,後續會一一介紹這些,這裡先介紹乙個工具tmux。
在ubuntu下安裝
apt-get install tmux
在centos下安裝
yum install tmux
安裝完成後,直接執行tmux命令即可進入
此時執行a.out,然後關閉該終端,可以看到a.out還在執行:
# ps aux | grep a.out
root 29299 0.0 0.0 4508 712 pts/2 s+ 15:10 0:00 ./a.out
看下它的父程序:
root@lan-dev-215:~/test# ps -ef | grep 29272
root 29272 29271 0 15:10 pts/2 00:00:00 -bash
root 29299 29272 0 15:10 pts/2 00:00:00 ./a.out
root 29333 28266 0 15:12 pts/0 00:00:00 grep --color=auto 29272
root@lan-dev-215:~/test# ps -ef | grep 29271
root 29271 1 0 15:10 ? 00:00:00 tmux
root 29272 29271 0 15:10 pts/2 00:00:00 -bash
root 29344 28266 0 15:12 pts/0 00:00:00 grep --color=auto 29271
可以看到對應的bash是tmux啟動的,我們把tmux殺掉看會怎麼樣
root@lan-dev-215:~/test# kill -9 29271
root@lan-dev-215:~/test# ps -ef | grep 29271
root 29384 28266 0 15:14 pts/0 00:00:00 grep --color=auto 29271
root@lan-dev-215:~/test# ps -ef | grep a.out
root 29387 28266 0 15:14 pts/0 00:00:00 grep --color=auto a.out
root@lan-dev-215:~/test# ps -ef | grep tmux
root 29390 28266 0 15:14 pts/0 00:00:00 grep --color=auto tmux
可以看到a.out也沒了。
到這裡我們就明白了:tmux是乙個守護程序,不受terminal的影響,從而保證了在它上面執行的程式可以繼續執行。
tmux還有非常多的功能,詳細了解可以看這裡
Redhat Linux 守護程序列表 1
守護程序列表 1.networkmanager 2.acpid acpid advanced configuration and power inte ce 是為替代傳統的 apm電源管理標準而推出的新型電源管理標準。通常膝上型電腦需要啟動電源進行管理。3.amanda 4.amd 自動安裝 nfs...
守護程序及守護程序輸出
1 建立乙個輸出程式 2 建立乙個守護程序 1 建立乙個輸出程式 守護程序不與終端聯絡,所以,需要另外建立乙個程式用於輸出。也可以直接使用 bin echo example daemon help.cc include int main int argc,char argv else if argc...
守護程序及守護程序輸出
1 建立乙個輸出程式 2 建立乙個守護程序 1 建立乙個輸出程式 守護程序不與終端聯絡,所以,需要另外建立乙個程式用於輸出。也可以直接使用 bin echo example daemon help.cc include int main int argc,char ar else if argc 2...