nohup &
程序在Linux上運行時,如果關閉session,程序會因爲收到SIGHUP信號結束,使用nohup可以免疫該信號。如果使用Ctrl+C,程序會因爲收到SIGINT信號結束,使用&可以免疫該信號。
nohup和&常常一起使用,這個時候會同時免疫SIGHUP和SIGINT信號:
nohup command &
systemd
systemd是Linux系統的第一個進程,使用systemd可以創建服務來運行程序,systemctl是systemd的主命令,可以用來管理服務,下面是常見的systemctl命令:
# 啓動服務
systemctl start servicename
# 停止服務
systemctl stop servicename
# 重啓服務
systemctl restart servicename
# 殺死一個服務的所有子進程
systemctl kill servicename
# 重新加載一個服務的配置文件
systemctl reload servicename
# 開機啓動該服務
systemctl enable servicename
# 開機不啓動該服務
systemctl disable servicename
# 查看服務當前狀態
systemctl status servicename
service配置文件存在以下三個文件夾中,優先級依此降低:
- /etc/systemd/system
- /run/systemd/system
- /usr/lib/systemd/system或/lib/systemd/system
service配置文件通常由3段組成,分別是[Unit],[Unit的類型:Service等],[Install]。
[Unit]常見參數:
- Description:描述信息。
- After:表明在哪個Unit後面啓動。
- Before:表明在哪個Unit前面啓動。
- Requires:強依賴的Unit,如果這些Unit沒啓動,那麼該Unit也不會啓動。
- Wants:弱依賴的Unit,啓動該Unit後最好還啓動哪些Unit。
- Conflicts:與哪些Unit衝突,如果這些Unit啓動了,那麼該Unit不啓動。
[Service]常見參數:
- ExecStart:啓動服務執行的命令。
- ExecStop:停止服務執行的命令。
- ExecReload:重新加載服務執行的命令。
- ExecStartPre:啓動服務之前執行的命令。
- ExecStartPost字段:啓動服務之後執行的命令。
- ExecStopPost字段:停止服務之後執行的命令。
- RestartSec:表示 Systemd 重啓服務之前,需要等待的秒數,默認是100毫秒。
- RemainAfterExit:如果設定爲yes,表示進程退出以後,服務仍然保持執行。
- Type:啓動類型,它可以設置爲下面的值:
- simple(默認值):ExecStart字段啓動的進程爲主進程。
- forking:ExecStart字段將以fork()方式啓動,此時父進程將會退出,子進程將成爲主進程。
- oneshot:類似於simple,但只執行一次,Systemd 會等它執行完,才啓動其他服務。
- dbus:類似於simple,但會等待 D-Bus 信號後啓動。
- notify:類似於simple,啓動結束後會發出通知信號,然後 Systemd 再啓動其他服務。
- idle:類似於simple,但是要等到其他任務都執行完,纔會啓動該服務。一種使用場合是爲讓該服務的輸出,不與其他服務的輸出相混合。
- Restart:定義了服務退出後的重啓方式,它可以設置爲下面的值:
- no(默認值):退出後不會重啓。
- on-success:只有正常退出時(退出狀態碼爲0),纔會重啓。
- on-failure:非正常退出時(退出狀態碼非0),包括被信號終止和超時,纔會重啓。
- on-abnormal:只有被信號終止和超時,纔會重啓。
- on-abort:只有在收到沒有捕捉到的信號終止時,纔會重啓。
- on-watchdog:超時退出,纔會重啓。
- always:不管是什麼退出原因,總是重啓。
- KillMode:定義了systemd如何停止服務,它可以設置爲下面的值:
- control-group(默認值):當前控制組裏面的所有子進程,都會被殺掉。
- process:只殺主進程。
- mixed:主進程將收到 SIGTERM 信號,子進程收到 SIGKILL 信號。
- none:沒有進程會被殺掉,只是執行服務的 stop 命令。
[Install]常見參數:
- WantedBy:表示該服務所在的Target,Target的含義是服務組,表示一組服務,默認的啓動Target爲multi-user.target。
hello.service:
[Unit]
Description=hello world
[Service]
Type=simple
ExecStart=/bin/hello
[Install]
WantedBy=multi-user.target