rc.local 方式
一、&
在 Linux 命令後加上 & 可以在後臺執行
二、nohup
對 SIGHUP 訊號免疫,對 SIGINT 訊號不免疫,可用 shopt | grep hup 檢視。
當關閉終端時,shell 預設會傳送 SIGHUP 訊號給與該終端關聯的程序,從而導致其程序跟隨終端退出。nohup 捕獲了 SIGHUP,並做了忽略處理,因此程序不會退出。
在 Linux 命令前加上 nohup 命令可以在退出帳戶/關閉終端之後繼續執行相應的程序。預設會將程序的所有輸出都重定向到一個名為 nohup.out 的檔案中。
與上面結合起來:nohup COMMAND &,這樣就能使命令永久的在後臺執行了。
三、rc.local
/etc/rc.d/rc.local 此檔案是為了相容性目的而新增的,建議建立自己的 systemd 服務或 udev 規則,在引導期間執行指令碼不是使用此檔案。
# 給許可權後,檔案中的命令才能在系統啟動後執行 chmod +x /etc/rc.d/rc.local
Systemd 方式
Systemd 簡介:https://fedoraproject.org/wiki/Systemd/zh-cn
管理自啟動服務(空格取消選中,按 TAB 切換確定):ntsysv
一、service unit 常用命令,以 mysql 服務為例
# 開機啟動 systemctl enable mysqld # 關閉開機啟動 systemctl disable mysqld # 啟動服務 systemctl start mysqld # 停止服務 systemctl stop mysqld # 重啟服務 systemctl restart mysqld # 檢視服務狀態 systemctl status mysqld systemctl is-active sshd.service # 結束服務程序(服務無法停止時) systemctl kill mysqld
二、服務啟動的配置檔案
配置檔案主要放在 /usr/lib/systemd/system 目錄,也可能在 /etc/systemd/system 目錄
# 檢視 sshd 服務啟動檔案 systemctl cat sshd.service # /usr/lib/systemd/system/sshd.service [Unit] Description=OpenSSH server daemon Documentation=man:sshd(8) man:sshd_config(5) After=network.target sshd-keygen.service Wants=sshd-keygen.service [Service] Type=notify EnvironmentFile=/etc/sysconfig/sshd ExecStart=/usr/sbin/sshd -D $OPTIONS ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
每個服務檔案以 .service 結尾,一般會分為 3 部分,必須包含 [Service] 部分
[Unit] 啟動順序與依賴關係
Description:當前服務的簡單描述 Documentation:指定 man 文件位置 After:如果 network.target 或 sshd-keygen.service 需要啟動,那麼 sshd.service 應該在它們之後啟動 Before:定義 sshd 應該在哪些服務之前啟動 注意:After 和 Before 欄位只涉及啟動順序,不涉及依賴關係。 Wants:表示 sshd.service 與 sshd-keygen.service 之間存在"弱依賴"關係,即如果"sshd-keygen.service"啟動失敗或停止執行,不影響 sshd.service 繼續執行 Requires:表示"強依賴"關係,即如果該服務啟動失敗或異常退出,那麼sshd.service 也必須退出 注意:Wants 欄位與 Requires 欄位只涉及依賴關係,與啟動順序無關,預設情況下是同時啟動。
[Service] 啟動行為
EnvironmentFile:許多軟體都有自己的環境引數檔案,該欄位指定檔案路徑 注意:/etc/profile 或者 /etc/profile.d/ 這些檔案中配置的環境變數僅對透過 pam 登入的使用者生效,而 systemd 是不讀這些配置的。 systemd 是所有程序的父程序或祖先程序,它的環境變數會被所有的子程序所繼承,如果需要給 systemd 配置預設引數可以在 /etc/systemd/system.conf 和 /etc/systemd/user.conf 中設定。
載入優先順序 system.conf 最低,可能會被其他的覆蓋。 Type:定義啟動型別。可設定:simple,exec,forking,oneshot,dbus,notify,idle simple(設定了 ExecStart= 但未設定 BusName= 時的預設值):ExecStart 欄位啟動的程序為該服務的主程序 forking:ExecStart 欄位的命令將以 fork() 方式啟動,此時父程序將會退出,子程序將成為主程序 ExecStart:定義啟動程序時執行的命令 上面的例子中,啟動 sshd 執行的命令是 /usr/sbin/sshd -D $OPTIONS,其中的變數 $OPTIONS 就來自 EnvironmentFile 欄位指定的環境引數檔案。類似的,還有如下欄位: ExecReload:重啟服務時執行的命令 ExecStop:停止服務時執行的命令 ExecStartPre:啟動服務之前執行的命令 ExecStartPost:啟動服務之後執行的命令 ExecStopPost:停止服務之後執行的命令 RemainAfterExit:設為yes,表示程序退出以後,服務仍然保持執行 KillMode:定義 Systemd 如何停止服務,可以設定的值如下: control-group(預設值):當前控制組裡面的所有子程序,都會被殺掉 process:只殺主程序 mixed:主程序將收到 SIGTERM 訊號,子程序收到 SIGKILL 訊號 none:沒有程序會被殺掉,只是執行服務的 stop 命令 Restart:定義了退出後,Systemd 的重啟方式。可以設定的值如下: no(預設值):退出後不會重啟 on-success:只有正常退出時(退出狀態碼為0),才會重啟 on-failure:非正常退出時(退出狀態碼非0),包括被訊號終止和超時,才會重啟 on-abnormal:只有被訊號終止和超時,才會重啟 on-abort:只有在收到沒有捕捉到的訊號終止時,才會重啟 on-watchdog:超時退出,才會重啟 always:不管是什麼退出原因,總是重啟 RestartSec:表示 Systemd 重啟服務之前,需要等待的秒數
配置中多個相同配置會選擇最後一個,下面結果是 execstart2
[Service]
ExecStart=/bin/echo execstart1
ExecStart=/bin/echo execstart2
所有的啟動設定之前,都可以加上一個連詞號(-),表示"抑制錯誤",即發生錯誤的時候,不影響其他命令的執行
EnvironmentFile=-/etc/sysconfig/sshd,表示即使 /etc/sysconfig/sshd 檔案不存在,也不會丟擲錯誤
[Install]
WantedBy:表示該服務所在的 Target(服務組)
關於 Target,執行級別
# 檢視預設 Target systemctl get-default # 結果為 multi-user.target,表示預設的啟動 Target 是multi-user.target。在這個組裡的所有服務,都將開機啟動。這就是為什麼 systemctl enable 命令能設定開機啟動的原因
# 檢視 multi-user.target 包含的所有服務 systemctl list-dependencies multi-user.target # 切換到另一個 target # shutdown.target 就是關機狀態 # 常用的 Target 有兩個:一個是 multi-user.target,表示多使用者命令列狀態;另一個是 graphical.target,表示圖形使用者狀態,它依賴於 multi-user.target systemctl isolate shutdown.target
三、自定義服務
在 /usr/lib/systemd/system 下新建服務指令碼
vim /usr/lib/systemd/system/zdy.service [Unit] Description=描述 Environment=環境變數或引數(系統環境變數此時無法使用) After=network.target [Service] Type=forking EnvironmentFile=所需環境變數檔案或引數檔案 ExecStart=啟動命令(需指定全路徑) ExecStop=停止命令(需指定全路徑) User=以什麼使用者執行命令 [Install] WantedBy=multi-user.target
新建完成後設定自啟動
# 新增或修改配置檔案後,需要重新載入 systemctl daemon-reload # 設定自啟動,實質就是在 /etc/systemd/system/multi-user.target.wants/ 新增服務檔案的連結 systemctl enable zdy
https://www.freedesktop.org/software/systemd/man/systemd.service.html & http://www.jinbuguo.com/systemd/systemd.service.html
https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html
https://www.ruanyifeng.com/blog/2016/02/linux-daemon.html