1. 程式人生 > >AIX自動啟動和關閉指令碼

AIX自動啟動和關閉指令碼

在系統重新啟動時自動啟動所需的服務,這樣可以免去登入到系統來手動啟動這些服務的任務。在關閉系統時,可以準備好指令碼,以受控的方式關閉這些服務。本文介紹了在系統重新啟動或關閉時用於啟動或停止應用程式的不同方法。

系統重新啟動可能發生在白天,也可能發生在夜晚(可能由於站點停電),若此時能夠讓系統上執行的服務(應用程式)自動啟動,則會非常有利。有時候就是這樣!讓服務啟動可以免除您登入並親自啟動它們的額外任務,這很好。但在某些情況下,我們不希望服務啟動。此時,我想到的是一個叢集服務環境,可能有不同的服務遍佈在幾個 IBM® AIX® 主機上,這些服務需要以正確的順序啟動,以便能夠正常地工作和整合。在這裡,您可能需要手動按順序啟動它們

啟動和關閉方法

為了讓服務自動啟動,AIX 提供了(類似於其他 UNIX/Linux 作業系統)inittab 檔案來實現這一點。您可以從 /etc/inittab 執行以下操作:

直接從 inittab 通過發出一個要執行的命令(指令碼)來啟動服務。

使用一個常用指令碼,通常表示為 rc.local,從 inittab 呼叫它,它包含一個或多個要執行的命令(或呼叫指令碼)。

使用從 inittab 呼叫的 rc.run level 目錄。

為了在系統關閉時自動關閉某個服務,AIX 提供了:

/etc/rc.shutdown 指令碼。此檔案與 rc.local 相反。在這裡,放置了系統發出關閉操作時要執行的命令。

在本文中,我不會介紹 rc.runlevel 目錄配置,而是打算介紹前面提到的其他程序。

為了將一個條目放進 inittab,您需要使用以下格式:

identifier : runlevel: action: command

其中:

identifier 是條目的惟一名稱。儘量將其長度保持在 1 到 7 個字元之間。它使條目變得可讀。

runlevel 是實際的 runlevel 數字,在到達 runlevel 時,將執行此 inittab 條目中所包含的指定命令。

action 是達到所需的 runlevel 時對待命令的方式,稍後您可以在這本文找到有關的更多資訊。

command 是將要執行的實際命令。

每個條目欄位用冒號 “:” 分隔。

在將條目新增到 inittab 中時,需要確保:

在 inittab 中有沒有錯別字,如果 inittab 中有錯別字,AIX 就會不明白它的含義,因而會進入一個程序迴圈。然後,init 命令無法正確地讀取檔案。

識別符號是絕對惟一的,否則,當重複的識別符號第二次出現時,可能無法像預期一樣正常執行。

如果從 /etc/rc.shutdown 呼叫的指令碼或命令中有錯別字,則存在 “語法或沒有發現命令” 問題,請注意,如果使用 shutdown 命令進行呼叫,則會中止關閉操作。因此,請在從 rc.shutdown 呼叫指令碼之前確保它可以正常工作。
需要了解的基本資訊
機器已經執行的時間

#uptime

當前的執行級別

#cat/etc/.init.state

上一次AIX重啟的時間

#who-b

調整 AIX 的執行級別

#/usr/lib/acct/fwtmp</var/adm/wtmp|greprun-level

這是一個註釋

在將條目新增到 inittab 中時,一定要記住,以一個冒號 “:” 開頭的行是一個註釋,因此,init 在讀取 inittab 時將會忽略該行的其餘部分。不要使用 “#”(井號)符號添加註釋。但是,您可以在行的末尾對註釋使用井號。

inittab 條目

讓我們來看看執行指令碼的 inittab 的一個條目。假設我們要執行一個將電子郵件傳送給系統管理員的指令碼,向系統管理員說明裝置在系統啟動時是可用的。

inittab 的條目如下所示:

mailout:2:once:/usr/local/bin/mailout>/dev/null>&1 #mail users

上面的條目可以概括如下:

mailout:惟一的識別符號

2:當系統達到 runlevel 2 時執行此指令碼(預設)

once:執行指令碼,並且不用等待其終止;init 將繼續處理 inittab。如果程序失敗,init 不會嘗試重新執行它。

/usr/local/bin/mailout:要執行的命令的完整路徑和指令碼名稱;請注意,輸出被丟棄到 /dev/dull。我們以 “#” 結束描述指令碼是做什麼的註釋。

就完整性而言,以下是有問題的指令碼:

#!/bin/bash
#mailout
/usr/sbin/sendmail -t <<mayday
From:`hostname`
To:rs6admins
Subject:`hostname` P -Series is up
The AIX `hostname` is now up,please check services.

mayday

在上述示例中,操作部分的屬性 once 表示只執行一次,但也有其他可以使用的操作。另外兩個常見的操作是:重生(respawn)和等待(wait)。對於重生操作,將會執行相應的命令,但 init 不會等待該命令的完成。如果命令停止,inittab 會重新啟動它,讓此程序繼續。所以,您應該查詢一個被重生的命令,該命令幾乎在所有時間都在執行。ps-ef 命令輸出的 STIME 欄位顯示了該命令最後一次重生的時間。被重生的典型程序是 tty、cron 和資料庫監控應用程式,以及基於網路檔案系統(NFS)的實用工具。另一個常用操作是等待。Init 執行命令,並等待命令完成,然後再讀取 inittab 檔案。使用等待操作的典型程序是網路身份驗證應用程式和列印、備份服務,等等。
如果需要啟動的程序不是 root 所擁有的,那麼只需將 su 命令作為 inittab 中的命令條目的一部分提供即可。下面的示例運行了 /home/ampter/start.sh,但首先會呼叫 su 命令,因此,程序是由使用者 ampter 啟動的。請注意,這裡使用了包圍了部分命令的引號:

amps:2:once:su - ampter "-c /home/ampter/start.sh" > /dev/console 2>&1

在編輯 inittab 檔案時,確保在儲存檔案後檢查了您的條目。然後,檢查您所做的更改。相信我,沒有人願意搞砸 inittab。如果某人感覺對手動編輯檔案沒有信心,那麼還有挽救的方法。AIX 提供以下實用工具:

chitab:修改退出的 inittab 條目

lsitab:列出 inittab 條目

mkitab:新增一個 inittab 條目

rmitab:刪除一個 inittab 條目
停止一個重生的程序

如果您需要停止程序重生(換句話說,可能需要停止它來執行一些維護工作),首先,編輯 inittab 檔案並在條目的開始處輸入一條註釋,這樣 init 就不會讀取它。下面的示例顯示,通過在條目的開始處放置一個冒號,可以讓 inittab 忽略該條目。

:fmc:2:respawn:/opt/db2_09_05/bin/db2fmcd #DB2 Fault Monitor Coordinator

接下來,讓 init 重新讀取 inittab 檔案:

teinit q

現在,停止該應用程式。執行所需的任何維護。要從 inittab 重新啟動程序,只需刪除條目開始處的冒號即可。然後,在命令提示符下,執行下面的命令,讓 init 重新讀取 inittab 檔案:

teinit q

現在,它將重新被啟動
rc.local繫結
啟動應用程式或在啟動時執行命令的另一種常見方法是使用 /etc/rc.local 檔案。在這裡它是一個可執行指令碼,從 inittab 檔案中被呼叫。rc.local 檔案可以包含一個或多個需要在啟動時執行的定製命令。在我看來,此檔案應該僅用於一次性或臨時的命令執行,而不是服務啟動指令碼。

允許從 inittab 呼叫 rc.local 的一個典型條目是:

rcloc:2:wait:/etc/rc.local>/dev/console 2>&1

在上例中,操作部分是等待。也就是說,init 要等到所有的命令都被執行,然後再繼續讀取 inittab 檔案。我使用 rc.local 檔案執行臨時或定製命令(如禁用分頁空間或斷開網路介面),因此沒有提供服務的完整啟動指令碼。這些命令將會在我的 inittab 檔案中。
關閉服務
當您發出一個 shutdown 命令時,會呼叫 /etc/rc.shutdown 檔案,這是一個可執行的指令碼。在該檔案中,將會放入用於關閉您的定製服務的命令或呼叫指令碼。當我必須關閉 AIX 系統來首次呼叫 /etc/rc.shutdown 檔案本身時,我覺得這是一個很好的實踐:

/etc/rc.shutdown

然後,我知道所有的應用程式都已正確關閉,在發出實際的 shutdown 命令之前,該命令無疑會重新執行 rc.shutdown 檔案。但是,我不介意這一點。