### 測試代碼如下
```php
<?php
$a = 1;
while(true){
echo "Tinywan ".$a++.'\r\n';
sleep(1);
}
```
> 是一個輸出`Tinywan`字符串與循環輪數的死循環程序,每輸出一行就休眠1秒。
### 原始輸出
前臺執行該程序運行效果
```shell
www@manager1:~/build$ php tinywan.php
Tinywan : 1
Tinywan : 2
Tinywan : 3
Tinywan : 4
Tinywan : 5
Tinywan : 6
Tinywan : 7
Tinywan : 8
Tinywan : 9
^C
```
程序每隔一秒會在終端輸出一個字符串 。
此時如果鍵入`Ctrl+C`?,程序會收到一個`SIGINT`信號,如果不做特殊處理,程序的默認行為是終止(如上圖)。
> **信號量`SIGINT `**
>
> 程序終止(interrupt)信號, 在用戶鍵入INTR字符(通常是Ctrl-C)時發出,用于通知前臺進程組終止進程。
### 使用 `&`
下來使用 `php tinywan.phpt & `后臺運行程序,會是什么效果呢?
```php
www@manager1:~/build$ php tinywan.php &
[1] 17153
www@manager1:~/build$ Tinywan : 1
Tinywan : 2
Tinywan : 3
^C
www@manager1:~/build$ Tinywan : 8
Tinywan : 9
Tinywan : 10
^C
www@manager1:~/build$ Tinywan : 11
Tinywan : 12
^C
www@manager1:~/build$ Tinywan : 16
```
如上運行結果:
* 首先會在終端顯示進程號是`17153`
* 鍵入**Ctrl + C**,發出SIGINT信號,程序會繼續運行 。
ps確認一下,確認進程依然在運行,進程號是`17153`。
```shell
www@manager1:~$ ps -axu|grep php
www 17153 0.0 1.2 210596 25788 pts/2 S 09:02 0:00 php tinywan.php
www 17386 0.0 0.0 14428 996 pts/3 S+ 09:07 0:00 grep --color=auto php
```
此時如果關掉session(關閉當前的終端回話窗口),程序會收到一個SIGHUP信號,此時會怎么樣呢?
```shell
www@manager1:~$ ps -axu|grep php
www 17386 0.0 0.0 14428 996 pts/3 S+ 09:07 0:00 grep --color=auto php
```
ps再次確認,可以看到關閉session之后,進程號是`17153`的進程也關閉了。
> 如果不關閉終端的情況,想結束該進程,可以使用kill命令:`kill -9 17153`
### 使用 nohup
```shell
www@manager1:~/build$ nohup php tinywan.php
nohup: ignoring input and appending output to 'nohup.out'
```
使用nohup 運行程序`tinywan.php`,會發現:
* 前臺沒有出現進程號
* 有一個`“忽略輸入,輸出至nohup.out”`的提示
* Tinywan的輸出也沒有出現在前臺
```shell
www@manager1:~$ ps -aux |grep php
www 17557 0.0 1.2 210596 25636 pts/3 S+ 09:12 0:00 php tinywan.php
www 17689 0.0 0.0 14428 1036 pts/2 S+ 09:15 0:00 grep --color=auto php
```
> 忽略輸入并將輸出附加到'nohup.out',查看這個文件內容
手動ps看進程號,這次 tinywan.php 的進程號是 `17557`。
此時如果關掉session,程序會收到一個`SIGHUP`信號,程序會不會關閉呢?
> **信號量 `SIGHUP `**
>
> 本信號在用戶終端連接(正常或非正常)結束時發出, 通常是在終端的控制進程結束時, 通知同一session內的各個作業,這時它們與控制終端不再關聯。
>
> 登錄Linux時,系統會分配給登錄用戶一個終端(Session)。在這個終端運行的所有程序,包括前臺進程組和后臺進程組,一般都屬于這個 Session。當用戶退出Linux登錄時,前臺進程組和后臺有對終端輸出的進程將會收到SIGHUP信號。這個信號的默認操作為終止進程,因此前臺進 程組和后臺有終端輸出的進程就會中止。不過可以捕獲這個信號,比如wget能捕獲SIGHUP信號,并忽略它,這樣就算退出了Linux登錄,wget也能繼續下載。
>
> 此外,對于與終端脫離關系的守護進程,這個信號用于通知它重新讀取配置文件。
```shell
www@manager1:~$ ps -aux |grep php
www 17557 0.0 1.2 210596 25636 ? S 09:12 0:00 php tinywan.php
www 17725 0.0 0.0 14428 1028 pts/2 S+ 09:16 0:00 grep --color=auto php
www@manager1:~$ ps -aux |grep php
www 17557 0.0 1.2 210596 25636 ? S 09:12 0:00 php tinywan.php
www 17734 0.0 0.0 14428 1092 pts/2 S+ 09:16 0:00 grep --color=auto php
```
關掉session后,再次ps看一下,ID為`17557`的 tinywan.php 進程還在。
> 這些只能通過kill把程序干掉了,killall之后,ps查看進程已經關閉。
### nohup 和 & 同時使用
終端運行
```shell
www@manager1:~/build$ nohup php tinywan.php &
[1] 17947
www@manager1:~/build$ nohup: ignoring input and appending output to 'nohup.out'
^C
www@manager1:~/build$
```
使用`nohup php tinywan.php &`運行程序后,可以看到
* 會在終端顯示進程號是 17947
* 也會有一個“忽略輸入,輸出至nohup.out”的提示
* 鍵入Ctrl + C,發送SIGINT信號,似乎沒反應。
關閉session,發送SIGHUP信號,再來看看。
```shell
www@manager1:~/build$ ps -aux |grep php
www 17947 0.0 1.2 210596 25644 pts/2 S 09:22 0:00 php tinywan.php
www 18013 0.0 0.0 14428 1092 pts/2 S+ 09:24 0:00 grep --color=auto php
```
ID為`17947`的進程依然存在,后續也只能用kill來關閉它。
### 結論
使用`&`后臺運行程序:
- 結果會輸出到終端
- 使用Ctrl + C發送SIGINT信號,程序免疫
- 關閉session發送SIGHUP信號,程序關閉
使用`nohup`運行程序:
- 結果默認會輸出到nohup.out
- 使用Ctrl + C發送SIGINT信號,程序關閉
- 關閉session發送SIGHUP信號,程序免疫
> **平日線上經常使用`nohup`和`&`配合來啟動程序**
- 同時免疫SIGINT和SIGHUP信號
- (最佳實踐)不要將信息輸出到終端標準輸出,標準錯誤輸出,而要用日志組件將信息記錄到日志里
- 基礎
- 1、命令幫助
- 2、磁盤管理
- 3、打包/ 壓縮
- 4、進程管理工具
- 5、網絡工具
- 6、常用命令
- 命令
- 1、Linux系統如何查看是多少位的
- 2、uptime命令
- 3、gpasswd 命令詳解
- 4、sed命令
- 5、awk命令
- 常用命令
- 文件權限
- 6、Linux用戶和用戶組管理
- 問題總結
- 1、安裝包
- 2、PHP編譯安裝時常見錯誤解決辦法
- 3、ubuntu源碼編譯安裝php常見錯誤解決辦法
- 4、文件權限中 chmod、u+x、u、r、w、x分別代表什么
- 5、修改文件權限命令chmod、chgrp、chown詳解
- 6、vim 選中多行批量縮進
- 7、gpasswd 和 usermod 的區別
- Ubuntu系統
- 1、自帶防火墻ufw配置和用法
- 2、常見錯誤解決
- 3、常用命令
- 了解nohup和&的功效
- 1.0 系統簡介
- 2.0 系統安裝
- 3.0 常用命令
- 4.0 Linux 服務管理
- 5.0 Linux 系統管理
- 6.0 Linux 權限管理之特殊權限
- 7.0 Linux 權限管理之基本權限
- 8.0 Linux 軟件安裝管理
- 9.0 Linux 網絡管理
- 10.0 Shell編程之條件判斷與流程控制
- 11.0 Shell編程之正則表達式
- 12.0 Shell編程之環境變量配置文件