是否可以在 Debian 的關機/重啟時首先執行腳本?
我目前正在嘗試註冊一個腳本*(位於 /etc/init.d 中),以使該腳本在關機/重啟時作為第一個腳本/程序執行(更改為執行級別 0 或 6)*。
我曾經
update-rc.d stop_servers stop 0 0 6 .
為這兩個執行級別註冊腳本。它在那裡正確註冊,但名稱為K01stop_servers
。這使得腳本不會作為第一個執行。我基本上需要一切仍在執行。這就是為什麼我希望它成為第一個。
也就是說,我仍然需要執行我的 apache、mysql 和 (s)ftp 伺服器,並且我的 java 仍然可以正常執行。
我如何實現這一目標?
腳本如下:
#! /bin/bash ### BEGIN INIT INFO # Provides: mc_server_safe_shutdown # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: # Default-Stop: 0 6 # Description: Shuts down all Minecraft serves softly ### END INIT INFO /root/.stop_servers exit 0
做你想做的事情的正確方法是**製作一個列出必要依賴項的自定義初始化腳本。在該腳本中,您可以啟動/停止相關服務,**具體取決於腳本是使用
start
還是stop
作為第一個參數呼叫的。您可以從一個簡單的腳本(例如
/etc/init.d/motd
模板)開始,因為它將包含所有基本部分,以使其全部工作。在您的情況下,您希望腳本說明# Required-Stop: $remote_fs $syslog apache2 mysql
因為在發出停止操作時,您需要執行
remote_fs
andsyslog
設施(但您不關心提供這些設施的確切服務是什麼),特別是執行apache2
andmysql
*服務。*請注意,Java 本身不是服務,但使用它可能會依賴於服務,包括文件系統。
Should-Stop
並Required-Stop
在 insserv(8) 手冊頁中描述為:在這兩種情況下,腳本系統都應該避免停止由這兩個
Stop
標籤聲明的服務,直到包含這些標籤的腳本停止。名稱來自服務初始化腳本的
Provides
(文字服務名稱,$
開頭無符號),以及來自/etc/insserv.conf
(設施名稱,$
開頭有符號)。當您擁有所需的腳本時,使用
update-rc.d
或直接使用insserv
.
如果您只想在關機時執行腳本,則不需要:
# Required-Start: $remote_fs $syslog
您可以將其留空。
每個腳本都有一個
Provides
條目,它定義了您可以在Required-Start
和Required-Stop
指令中使用的其他腳本的名稱。兩個欄位中的順序相反。如果必須在腳本之前啟動某些內容,則必須將其放入Required-Start
指令中。但如果腳本必須在某個服務之前停止,則該服務的名稱必須放在Required-Stop
.因此,在您的範例中,您希望在關閉時 apache 和 mysql 終止之前執行腳本。您所要做的就是檢查
Provides
適當的 init 文件中的指令。$ cat /etc/init.d/apache2 ... # Provides: apache2 ...
和:
$ cat /etc/init.d/mysql ... # Provides: mysql ...
現在您只需在指令下添加
apache2
和mysql
到您的腳本:Required-Stop
# Required-Stop: apache2 mysql
您可以在此處閱讀有關初始化腳本標頭的更多資訊。還有一些關於設施名稱的資訊,例如提到的
$remote_fs
和$syslog
:$ local_fs – all local filesystems are mounted. All scripts that write in /var/ need to depend on this, unless they already depend on $ 遠端文件系統。
$network – 低級網路(乙太網卡;可能意味著 PCMCIA 正在執行)
$named – 可以提供主機名解析(如果存在)的守護程序正在執行。例如,用於查詢 DNS、NIS+ 或 LDAP 的守護程序。
$portmap – 提供 RFC 1833 中定義的 SunRPC/ONCRPC 埠映射服務的守護程序(如果存在)正在執行所有遠端
$ remote_fs – all filesystems are mounted. In some LSB run-time environments, filesystems such as /usr may be remote. If the script need a mounted /usr/, it needs to depend on $ 遠端文件系統。腳本取決於 $ remote_fs do not need to depend on $ local_fs。在關閉期間,需要在 sendigs 殺死所有程序之前執行的腳本應該依賴於 $remote_fs。
$syslog – 系統記錄器正在執行
$ time – the system time has been set, for example by using a network-based time program such as ntp or rdate, or via the hardware Real Time Clock. Note that just depending on ntp will not result in an accurate time just after ntp started. It usually takes minutes until ntp actually adjusts the time. Also note that standard insserv.conf just lists hwclock as $ 時間。
$ all – facility supported by insserv to start a script after all the other scripts, at the end of the boot sequence. This only work for start ordering, not stop ordering. It is not possible to depend on a script which depend on $ 全部。
在初始化腳本中更改標頭後,您必須執行
update-rc.d
,它將根據標頭設置所有腳本的正確順序:# update-rc.d script defaults