RPM包rpmbuild SPEC文件深度說明 【裝載】


轉載地址【請查看作者原文】

http://hlee.iteye.com/blog/343499

http://laoguang.blog.51cto.com/6013350/1103628

 

 
關鍵字
spec腳本包括很多關鍵字,主要有:
引用
Name: 軟件包的名稱,后面可使用%{name}的方式引用
Summary: 軟件包的內容概要
Version: 軟件的實際版本號,例如:1.0.1等,后面可使用%{version}引用
Release: 發布序列號,例如:1linuxing等,標明第幾次打包,后面可使用%{release}引用
Group: 軟件分組,建議使用標准分組
License: 軟件授權方式,通常就是GPL
Source: 源代碼包,可以帶多個用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用
BuildRoot: 這個是安裝或編譯時使用的“虛擬目錄”,考慮到多用戶的環境,一般定義為:
%{_tmppath}/%{name}-%{version}-%{release}-root

%{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n}
該參數非常重要,因為在生成rpm的過程中,執行make install時就會把軟件安裝到上述的路徑中,在打包的時候,同樣依賴“虛擬目錄”為“根目錄”進行操作。
后面可使用$RPM_BUILD_ROOT 方式引用。
URL: 軟件的主頁
Vendor: 發行商或打包組織的信息,例如RedFlag Co,Ltd
Disstribution: 發行版標識
Patch: 補丁源碼,可使用Patch1、Patch2等標識多個補丁,使用%patch0或%{patch0}引用
Prefix: %{_prefix} 這個主要是為了解決今后安裝rpm包時,並不一定把軟件安裝到rpm中打包的目錄的情況。這樣,必須在這里定義該標識,並在編寫%install腳本的時候引用,才能實現rpm安裝時重新指定位置的功能
Prefix: %{_sysconfdir} 這個原因和上面的一樣,但由於%{_prefix}指/usr,而對於其他的文件,例如/etc下的配置文件,則需要用%{_sysconfdir}標識
Build Arch: 指編譯的目標處理器架構,noarch標識不指定,但通常都是以/usr/lib/rpm/marcros中的內容為默認值
Requires: 該rpm包所依賴的軟件包名稱,可以用>=或<=表示大於或小於某一特定版本,例如:
libpng-devel >= 1.0.20 zlib
※“>=”號兩邊需用空格隔開,而不同軟件名稱也用空格分開
還有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是針對不同階段的依賴指定
Provides: 指明本軟件一些特定的功能,以便其他rpm識別
Packager: 打包者的信息
%description 軟件的詳細說明


spec腳本主體
spec腳本的主體中也包括了很多關鍵字和描述,下面會一一列舉。我會把一些特別需要留意的地方標注出來。
%prep 預處理腳本
%setup -n %{name}-%{version} 把源碼包解壓並放好
通常是從/usr/src/asianux/SOURCES里的包解壓到/usr/src/asianux/BUILD/%{name}-%{version}中。
一般用%setup -c就可以了,但有兩種情況:一就是同時編譯多個源碼包,二就是源碼的tar包的名稱與解壓出來的目錄不一致,此時,就需要使用-n參數指定一下了。
%patch 打補丁
通常補丁都會一起在源碼tar.gz包中,或放到SOURCES目錄下。一般參數為:
%patch -p1 使用前面定義的Patch補丁進行,-p1是忽略patch的第一層目錄
%Patch2 -p1 -b xxx.patch 打上指定的補丁,-b是指生成備份文件
◎補充一下
引用
%setup 不加任何選項,僅將軟件包打開。
%setup -n newdir 將軟件包解壓在newdir目錄。
%setup -c 解壓縮之前先產生目錄。
%setup -b num 將第num個source文件解壓縮。
%setup -T 不使用default的解壓縮操作。
%setup -T -b 0 將第0個源代碼文件解壓縮。
%setup -c -n newdir 指定目錄名稱newdir,並在此目錄產生rpm套件。
%patch 最簡單的補丁方式,自動指定patch level。
%patch 0 使用第0個補丁文件,相當於%patch ?p 0。
%patch -s 不顯示打補丁時的信息。
%patch -T 將所有打補丁時產生的輸出文件刪除。

%configure 這個不是關鍵字,而是rpm定義的標准宏命令。意思是執行源代碼的configure配置
在/usr/src/asianux/BUILD/%{name}-%{version}目錄中進行 ,使用標准寫法,會引用/usr/lib/rpm/marcros中定義的參數。
另一種不標准的寫法是,可參考源碼中的參數自定義,例如:
引用
CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix}
%build 開始構建包
在/usr/src/asianux/BUILD/%{name}-%{version}目錄中進行make的工作 ,常見寫法:
引用
make %{?_smp_mflags} OPTIMIZE="%{optflags}"
都是一些優化參數,定義在/usr/lib/rpm/marcros中
%install 開始把軟件安裝到虛擬的根目錄中
在/usr/src/asianux/BUILD/%{name}-%{version}目錄中進行make install的操作。這個很重要,因為如果這里的路徑不對的話,則下面%file中尋找文件的時候就會失敗。 常見內容有:
%makeinstall 這不是關鍵字,而是rpm定義的標准宏命令。也可以使用非標准寫法:
引用
make DESTDIR=$RPM_BUILD_ROOT install
或 引用
make prefix=$RPM_BUILD_ROOT install
需要說明的是,這里的%install主要就是為了后面的%file服務的。所以,還可以使用常規的系統命令:
引用
install -d $RPM_BUILD_ROOT/
cp -a * $RPM_BUILD_ROOT/

%clean 清理臨時文件
通常內容為:
引用
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"
rm -rf $RPM_BUILD_DIR/%{name}-%{version}

※注意區分$RPM_BUILD_ROOT和$RPM_BUILD_DIR:
$RPM_BUILD_ROOT是指開頭定義的BuildRoot,而$RPM_BUILD_DIR通常就是指/usr/src/asianux/BUILD,其中,前面的才是%file需要的。

%pre rpm安裝前執行的腳本
%post rpm安裝后執行的腳本
%preun rpm卸載前執行的腳本
%postun rpm卸載后執行的腳本
 
%preun %postun 的區別是什么呢?
前者在升級的時候會執行,后者在升級rpm包的時候不會執行

%files 定義那些文件或目錄會放入rpm中
這里會在虛擬根目錄下進行,千萬不要寫絕對路徑,而應用宏或變量表示相對路徑。 如果描述為目錄,表示目錄中除%exclude外的所有文件。
%defattr (-,root,root) 指定包裝文件的屬性,分別是(mode,owner,group),-表示默認值,對文本文件是0644,可執行文件是0755

%exclude 列出不想打包到rpm中的文件
※小心,如果%exclude指定的文件不存在,也會出錯的。
%changelog 變更日志

※特別需要注意的是:%install部分使用的是絕對路徑,而%file部分使用則是相對路徑,雖然其描述的是同一個地方。千萬不要寫錯。


就是%file中必須明白,用的是相對目錄 引用
%files
%defattr(-,root,root)
%{_bindir}
%{_libdir}
%{_datadir}
%exclude %{_libdir}/debug

制作補丁
詳細看參考: [原]使用diff同patch工具

如何編寫%file段
由於必須在%file中包括所有套件中的文件,所以,我們需要清楚編譯完的套件到底包括那些文件?
常見的做法是,人工模擬一次編譯的過程:

 這樣,整個套件的內容就會被放到/usr/local/xxx中,可根據情況編寫%file和%exclude段。

※當然,這個只能對源碼按GNU方式編寫,並使用GNU autotool創建的包有效,若自定義Makefile則不能一概而論。
關於rpm中的執行腳本
如果正在制作的rpm包是准備作為放到系統安裝光盤中的話,則需要考慮rpm中定義的腳本是否有問題。由於系統在安裝的時候只是依賴於一個小環境進行,而該環境與實際安裝完的環境有很大的區別,所以,大部分的腳本在該安裝環境中都是無法生效,甚至會帶來麻煩的。
所以,對於這樣的,需要放到安裝光盤中的套件,不加入執行腳本是較佳的方法。
另外,為提供操作中可參考的信息,rpm還提供了一種信號機制:不同的操作會返回不同的信息,並放到默認變量$1中。

 

引用
0代表卸載、1代表安裝、2代表升級

 

一.RPM制作步驟

我們在企業中有的軟件基本都是編譯的,我們每次安裝都得編譯,那怎么辦呢?那就根據我們的需求制作RPM安裝包吧。先來說說基本布驟:

1.Planning what you want             計划做什么rpm包。軟件的?庫的?

2.Gathering the software to package  收集原材料,即收集源碼包

3.Patch the software as need         如果需要打補丁,收集補丁文件。此布驟不是必須

4.Outling any dependenies      確定依賴關系包

------------------  上述動作可由我們手動編譯一次軟件來確定  -------------------

5.Building RPMs                      開始動手制作RPM包

5.1 Set up the directory stucture 設定好目錄結構,我們在這些目錄中制作我們的RPM包,我們需要下列目錄

BUILD 源代碼解壓后的存放目錄

RPMS    制作完成后的RPM包存放目錄,里面有與平台相關的子目錄

SOURCES 收集的源材料,補丁的存放位置

SPECS   SPEC文件存放目錄

SRMPS   存放SRMPS生成的目錄

5.2 Place the Sources in the right directory   把源材料放到正確的位置

5.3 Create a spec file that tell rpmbuild command what to do 創建spec文件,這是綱領文件,rpmbuild命令根據spec文件來制作合適的rpm包

5.4 Build the source and binary RPMS 制作src或二進制rpm包

6.Test RPMS 測試制作的PRM包

7.Add signature for RPM  為RPM包簽名

二.RPM包制作實例

我還是用連貫的 話為大家敘述一遍吧,我們首先確實我們要為什么做rpm包,通常我們是為一些軟件,比如httpd,nginx等,然后去收集這些軟件包的源代碼,如果有 需要的話也收集這些補丁文件,手動編譯安裝一下這個軟件(當然如果是不需要編譯的就不用演練了),確定依賴的軟件包,並記錄下來,下面開始准備制作 tengine的PRM包吧:

1.建立一個普通用戶,有普通用戶來制作rpm,用root的可能會因為代碼問題導致毀滅的后果

  1. useradd ibuler 
  2. su - ibuler 

2.確定我們在 哪個目錄下制作RPM,通常這個目錄我們topdir,這個需要在宏配置文件中指定,這個配置文件稱為macrofiles,它們通常為 /usr/lib/rpm/macros:/usr/lib/rpm/macros.*:~/.rpmmacros,這個在rhel 5.8中可以通過rpmbuild --showrc | grep macrofiles  查看,6.3的我使用這個找不到,但使用是一樣的。你可以通過rpmbuild --showrc | grep topdir 查看你系統默認的工作車間 

  1. rpmbuild --showrc | grep topdir 
  2.  
  3. -14: _builddir  %{_topdir}/BUILD 
  4. -14: _buildrootdir  %{_topdir}/BUILDROOT 
  5. -14: _rpmdir    %{_topdir}/RPMS 
  6. -14: _sourcedir %{_topdir}/SOURCES 
  7. -14: _specdir   %{_topdir}/SPECS 
  8. -14: _srcrpmdir %{_topdir}/SRPMS 
  9. -14: _topdir    %{getenv:HOME}/rpmbuild 

我們還是自定義工作目錄(或車間)吧

  1. vi ~/.rpmmacros 
  2. %_topdir        /home/ibuler/rpmbuild    ##目錄可以自定義 
  3.  
  4. mkdir ~/rpmbuild  

3.在topdir下建立需要的目錄

  1. cd ~/rpmbuild  
  2. mkdir -pv {BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} 

4.把收集的源碼放到SOURCES下

  1. cp /tmp/tengine-1.4.2.tar.gz SOURCES  ##事先放好的

5.在SPECS下建立重要的spec文件

  1. cd SPECS 
  2. vi tengine.spec          ##內容見后講解,rhel6.3會自動生成模板 

6.用rpmbuild命令制作rpm包,rpmbuild命令會根據spec文件來生成rpm包 

  1. rpmbuild  
  2. -ba 既生成src.rpm又生成二進制rpm 
  3. -bs 只生成src的rpm 
  4. -bb 只生二進制的rpm 
  5. -bp 執行到pre 
  6. -bc 執行到 build段 
  7. -bi 執行install段 
  8. -bl 檢測有文件沒包含 

我們可以一步步試,先rpmbuild -bp ,再-bc 再-bi 如果沒問題,rpmbuild -ba 生成src包與二進制包吧

7.安裝測試有沒有問題,能否正常安裝運行,能否正常升級,卸載有沒有問題

root用戶測試安裝:

  1. cd /tmp
  2. cp /home/ibuler/rpmbuild/RPMS/x86_64/tengine-1.4.2-1.el6.x86_64.rpm /tmp  
  3. rpm -ivh tengine-1.4.2-1.el6.x86_64.rpm  ##測試安裝 
  4. rpm -e tengine                           ##測試卸載,如果版本號比原來的高,升級測試 

8.如果沒問題為rpm包簽名吧,防止有人惡意更改    ##這個先不寫了,有點晚了,以后補上

到此整個流程完畢。下面來說說其中最最重要的spec的格式,先說最簡單的,最容易實現的

到此一個簡單的tengine RPM包制作好了。

三.RPM包制作拓展

下面我們來拓展一下,比如:我們想為tengine增加控制腳本,可以通過 start|stop控制,我們還想更換一下默認的首頁index.html,默認的fastcgi_params是不能直接連接php的,所以我們替換 為新的配置文件,我們也可以用設置好的nginx.conf替換原來的nginx.conf。基於上述步驟下面繼續

1.把修改后的首頁文件index.html,控制腳本init.nginx,fastCGI配置文件fastcgi_params,Nginx配置文件nginx.conf 放到SOURCES中 。 

  1. [ibuler@ng1 rpmbuild]$ ls SOURCES/ 
  2. fastcgi_params  index.html  init.nginx  nginx.conf  tengine-1.4.2.tar.gz 

2 編輯tengine.spec,修改

2.1 介紹區域的SOURCE0下增加如下

  1. Source0:        %{name}-%{version}.tar.gz 
  2. Source1:        index.html 
  3. Source2:        init.nginx 
  4. Source3:        fastcgi_params 
  5. Source4:        nginx.conf 

2.2 安裝區域增加如下

  1. make install DESTDIR=%{buildroot} 
  2. %{__install} -p -D %{SOURCE1} %{buildroot}/usr/html/index.html  #%{__install}這個宏代表install命令
  3. %{__install} -p -D -m 0755 %{SOURCE2} %{buildroot}/etc/rc.d/init.d/nginx 
  4. %{__install} -p -D %{SOURCE3} %{buildroot}/etc/nginx/fastcgi_params 
  5. %{__install} -p -D %{SOURCE4} %{buildroot}/etc/nginx/nginx.conf 

2.3 腳本區域增加如下

  1. %post 
  2. if [ $1 == 1 ];then 
  3.         /sbin/chkconfig --add nginx 
  4. fi 

2.4 %file區域增加如下

  1. %files 
  2. %defattr (-,root,root,0755) 
  3. /etc/ 
  4. /usr/ 
  5. /var/ 
  6. %config(noreplace) /etc/nginx/nginx.conf  #%config表明這是個配置文件noplace表明不能替換
  7. %config(noreplace) /etc/nginx/fastcgi_params 
  8. %doc /usr/html/index.html  #%doc表明這個是文檔
  9. %attr(0755,root,root) /etc/rc.d/init.d/nginx #%attr后面的是權限,屬主,屬組

3. 生成rpm文件測試

  1. rpmbuild -ba tengine.spec 

4. 安裝測試 

到此RPM包制作完畢,你可以根據你的需求制作RPM包吧。

四.RPM包簽名

1.生成GPG簽名密鑰,我用的是root用戶

  1. gpg --gen-key 
  2.  
  3. Your selection?1<Enter>  ##默認即可
  4. What keysize do you want? (2048) 1024<Enter>  ##密鑰長度
  5. Key is valid for? (0) 1y<Enter>  ##有效期
  6. Is this correct? (y/N) y<Enter>  ##確認
  7. Real name: LaoGuang<Enter>  ##密鑰名稱
  8. Email address: ibuler@qq.com<Enter>  ##郵件
  9. Comment: GPG-RPM-KEY<Enter>  ##備注
  10. Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O<ENTER
  11. Enter passphrase  OK <Enter>  ##使用空密碼,也可以輸入                              
  12. <Take this one anyway<Enter
  13. <Take this one anyway<Enter

有時可能因為隨機數不夠導致卡在那里,這時候你就yum 安裝幾個包組,馬上就夠了。

2.查看成生的密鑰

  1. [root@ng1 dev]# gpg --list-keys 
  2. /root/.gnupg/pubring.gpg 
  3. ------------------------ 
  4. pub   1024R/49C99488 2012-11-28 [expires: 2013-11-28] 
  5. uid                  LaoGuang (GPG-RPM-KEY) <ibuler@qq.com
  6. sub   1024R/69BA199D 2012-11-28 [expires: 2013-11-28] 

3.導出公鑰以供大家使用驗證

  1. gpg --export -a "LaoGuang" > RPM-GPG-KEY-LaoGuang 

4.編緝 .rpmmacros說明我們用哪一個密鑰加密,我們用root加密的那就在/root下編輯

  1. vi ~/.rpmmacros 
  2. %_gpg_name LaoGuang 

5.為rpm包加簽名

  1.  rpm --addsign tengine-1.4.2-1.el6.x86_64.rpm  
  2. Enter pass phrase:   ##輸入密鑰
  3. Pass phrase is good. 
  4. tengine-1.4.2-1.el6.x86_64.rpm: 

到此簽名添加成功,下面來驗證

6.講剛才導出的公鑰導入rpm中

  1. rpm --import RPM-GPG-KEY-LaoGuang 

7.驗證

  1. rpm --checksig tengine-1.4.2-1.el6.x86_64.rpm  
  2.  
  3. tengine-1.4.2-1.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK 

到此整個過程完畢,你也試試吧




Group:

軟件包所屬類別,具體類別有:

Amusements/Games (娛樂/游戲)

Amusements/Graphics(娛樂/圖形)

Applications/Archiving (應用/文檔)

Applications/Communications(應用/通訊)

Applications/Databases (應用/數據庫

Applications/Editors (應用/編輯器)

Applications/Emulators (應用/仿真器)

Applications/Engineering (應用/工程)

Applications/File (應用/文件)

Applications/Internet (應用/因特網)

Applications/Multimedia(應用/多媒體)

Applications/Productivity (應用/產品)

Applications/Publishing(應用/印刷)

Applications/System(應用/系統)

Applications/Text (應用/文本)

Development/Debuggers (開發/調試器)

Development/Languages (開發/語言)

Development/Libraries (開發/函數庫)

Development/System (開發/系統)

Development/Tools (開發/工具)

Documentation (文檔)

System Environment/Base(系統環境/基礎)

System Environment/Daemons (系統環境/守護)

System Environment/Kernel (系統環境/內核)

System Environment/Libraries (系統環境/函數庫)

System Environment/Shells (系統環境/接口)

User Interface/Desktops(用戶界面/桌面)

User Interface/X (用戶界面/X窗口)

User Interface/X Hardware Support (用戶界面/X硬件支持)


測試通過實例:
cat rpmbuild/SPECS/tengine.spec 
# This is a sample spec file for test rpm package
%define _prefix    /usr/local/nginx
%define _user      nobody
%define _user_uid  99
%define _group     nobody
%define _group_uid 99
%define _sbin_path      /usr/sbin

%define name      Tengine
%define summary   Tengine for Webserver
%define version   2.1.2
%define release   1
%define license   GPL
%define group     Application/WebServer
%define source    tengine-%{version}.tar.gz
%define url       http://tengine.taobao.org/
%define vendor    Taobao
%define packager  webuser

Name:	        tengine
Version:        2.1.2	
Vendor:         Taobao
Release:	1
Summary:	GUN Tengine2.1.2

Group:		Application/WebServer
License:	GPL
URL:	        http://tengine.taobao.org/	
Source0:	tengine-%{version}.tar.gz
Source1:        index.html
Source2:        nginx
Source3:        fastcgi_params
Source4:        nginx.conf
Packager:       webuser
#BuildRoot:	/www/rpmbuild/%{name}-%{version}-%{release}-rpmbuild
BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root	

#BuildRequires:	gcc>=4.4.7, gcc-c++>=4.4.7, zlib-devel>=1.2.3, pcre-devel>=8.12, openssl-devel>=1.0.1e, autoconf>=2.63, automake>=1.11.1
#BuildRequires:  mhash-devel
#BuildRequires:  libxml2-devel
#BuildRequires:  libxslt-devel
#BuildRequires:  libgd-devel
#
#Requires:	gcc>=4.4.7, gcc-c++>=4.4.7, zlib-devel>=1.2.3, pcre-devel>=8.12, openssl-devel>=1.0.1e, autoconf>=2.63, automake>=1.11.1
#Requires:      mhash-devel
#Requires:      libxml2-devel
#Requires:      libxslt-devel
#Requires:      libgd-devel

%description
The GNU Tengine WEB Server program.  


%prep
%setup -q -n tengine-%{version}

%build
./configure \
  --user=nobody \
  --group=nobody \
  --prefix=/usr/local/nginx \
  --with-ipv6 \
  --with-debug \
  --with-http_sub_module \
  --with-http_stub_status_module \
  --with-http_ssl_module \
  --with-http_spdy_module \
  --with-http_v2_module \
  --with-http_realip_module \
  --with-http_gzip_static_module \
  --with-http_auth_request_module \
  --with-http_perl_module \
  --with-pcre \
  --add-module=../ngx_cache_purge-2.3   
make 


%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
%{__install} -p -D %{SOURCE1} %{buildroot}/usr/local/nginx/html/index.html
%{__install} -p -D -m 0755 %{SOURCE2} %{buildroot}/etc/rc.d/init.d/nginx 
%{__install} -p -D %{SOURCE3} %{buildroot}/usr/local/nginx/conf/fastcgi_params 
%{__install} -p -D %{SOURCE4} %{buildroot}/usr/local/nginx/conf/nginx.conf 

mkdir -p %{buildroot}/%{_initrddir}
(
cat <<'EOF'
#!/bin/bash
# tengine Startup script for the tengine HTTP Server
# this script create it by Luo Hui at 2008.11.11.
# if you find any errors on this scripts,please contact Luo Hui.
# and send mail to farmer.luo at gmail dot com.
#
# chkconfig: - 85 15
# description: tengine is a high-performance web and proxy server.
# processname: tengine
# tengine pidfile: /var/run/tengine.pid
# tengine config: /usr/local/tengine/conf/nginx.conf
 
 
nginxd=%{_prefix}/sbin/nginx
nginx_config=%{_prefix}/conf/nginx.conf
nginx_pid=/var/run/tengine.pid
 
RETVAL=0
prog="nginx"
 
# Source function library.
. /etc/rc.d/init.d/functions
 
# Source networking configuration.
. /etc/sysconfig/network
 
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
 
[ -x $nginxd ] || exit 0
 
ulimit -HSn 65535
 
 
# Start tengine daemons functions.
nginx_start() {
 
        if [ -e $nginx_pid ];then
                echo "tengine already running...."
                exit 1
        fi
 
        if [ ! -d %{_prefix}/logs ];then
                mkdir -p %{_prefix}/logs
        fi
 
        if [ ! -d %{_prefix}/tmp ]; then
                mkdir -p %{_prefix}/tmp
        fi
 
        if [ -e $nginx_pid ];then
                echo "tengine already running...."
                exit 1
        fi
 
        echo -n $"Starting $prog: "
        daemon $nginxd -c ${nginx_config}
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch /var/lock/subsys/tengine
        return $RETVAL
 
}
 
 
# Stop tengine daemons functions.
nginx_stop() {
        echo -n $"Stopping $prog: "
        killproc $nginxd
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f /var/lock/subsys/tengine $nginx_pid
}
 
 
# reload tengine service functions.
nginx_reload() {
 
        echo -n $"Reloading $prog: "
        #kill -HUP `cat ${nginx_pid}`
        killproc $nginxd -HUP
        RETVAL=$?
        echo
 
}
 
# See how we were called.
case "$1" in
start)
        nginx_start
        ;;
 
stop)
        nginx_stop
        ;;
 
reload)
        nginx_reload
        ;;
 
restart)
        nginx_stop
        nginx_start
        ;;
 
status)
        status $prog
        RETVAL=$?
        ;;
*)
        echo $"Usage: tengine {start|stop|restart|reload|status|help}"
        exit 1
esac
 
exit $RETVAL
EOF
) >%{buildroot}/%{_initrddir}/tengine

chmod 755 %{buildroot}/%{_initrddir}/tengine

%clean
rm -rf %{buildroot}

%pre
grep -q ^%{_group}: /etc/group || %{_sbin_path}/groupadd -g %{_group_gid} %{_group}
grep -q ^%{_user}: /etc/passwd || %{_sbin_path}/useradd -g %{_group} -u %{_user_uid} -d %{_prefix} -s /sbin/nologin -M %{_user}

%post
chkconfig --add tengine
chkconfig --level 345 tengine on
 
 
%preun
chkconfig --del tengine
 
 
#%postun
#if [ $1 = 0 ]; then
#        userdel %{_user} > /dev/null 2>&1 || true
#fi

%files
%defattr(-,root,root,-)
%dir %{_prefix}/
%attr(0755,%{_user},%{_group}) %dir %{_prefix}/logs
%dir %{_prefix}/modules
%dir %{_prefix}/sbin
%dir %{_prefix}/conf
%dir %{_prefix}/html
%{_prefix}/sbin/nginx
%{_prefix}/sbin/dso_tool
%{_prefix}/conf/module_stubs
%{_prefix}/conf/fastcgi.conf
%{_prefix}/conf/fastcgi_params.default
%{_prefix}/conf/win-utf
%{_prefix}/conf/koi-utf
%{_prefix}/conf/nginx.conf.default
%{_prefix}/conf/fastcgi.conf.default
%config(noreplace) %{_prefix}/conf/fastcgi_params
%{_prefix}/conf/koi-win
%{_prefix}/conf/mime.types
%config(noreplace) %{_prefix}/conf/nginx.conf
%{_prefix}/conf/mime.types.default
%{_prefix}/conf/scgi_params
%{_prefix}/conf/scgi_params.default
%{_prefix}/conf/uwsgi_params
%{_prefix}/conf/uwsgi_params.default
%{_prefix}/html/50x.html
%{_prefix}/html/index.html
/usr/lib64/perl5/perllocal.pod
/usr/local/lib64/perl5/auto/nginx/.packlist
/usr/local/lib64/perl5/auto/nginx/nginx.bs
/usr/local/lib64/perl5/auto/nginx/nginx.so
/usr/local/lib64/perl5/nginx.pm
%{_prefix}/conf/browsers
%{_prefix}/include/nginx.h
%{_prefix}/include/ngx_alloc.h
%{_prefix}/include/ngx_array.h
%{_prefix}/include/ngx_atomic.h
%{_prefix}/include/ngx_auto_config.h
%{_prefix}/include/ngx_auto_headers.h
%{_prefix}/include/ngx_buf.h
%{_prefix}/include/ngx_channel.h
%{_prefix}/include/ngx_conf_file.h
%{_prefix}/include/ngx_config.h
%{_prefix}/include/ngx_connection.h
%{_prefix}/include/ngx_core.h
%{_prefix}/include/ngx_crc.h
%{_prefix}/include/ngx_crc32.h
%{_prefix}/include/ngx_crypt.h
%{_prefix}/include/ngx_cycle.h
%{_prefix}/include/ngx_errno.h
%{_prefix}/include/ngx_event.h
%{_prefix}/include/ngx_event_busy_lock.h
%{_prefix}/include/ngx_event_connect.h
%{_prefix}/include/ngx_event_openssl.h
%{_prefix}/include/ngx_event_pipe.h
%{_prefix}/include/ngx_event_posted.h
%{_prefix}/include/ngx_event_timer.h
%{_prefix}/include/ngx_file.h
%{_prefix}/include/ngx_files.h
%{_prefix}/include/ngx_gcc_atomic_x86.h
%{_prefix}/include/ngx_hash.h
%{_prefix}/include/ngx_http.h
%{_prefix}/include/ngx_http_busy_lock.h
%{_prefix}/include/ngx_http_cache.h
%{_prefix}/include/ngx_http_config.h
%{_prefix}/include/ngx_http_core_module.h
%{_prefix}/include/ngx_http_perl_module.h
%{_prefix}/include/ngx_http_reqstat.h
%{_prefix}/include/ngx_http_request.h
%{_prefix}/include/ngx_http_script.h
%{_prefix}/include/ngx_http_spdy.h
%{_prefix}/include/ngx_http_spdy_module.h
%{_prefix}/include/ngx_http_ssi_filter_module.h
%{_prefix}/include/ngx_http_ssl_module.h
%{_prefix}/include/ngx_http_upstream.h
%{_prefix}/include/ngx_http_upstream_round_robin.h
%{_prefix}/include/ngx_http_v2.h
%{_prefix}/include/ngx_http_v2_module.h
%{_prefix}/include/ngx_http_variables.h
%{_prefix}/include/ngx_inet.h
%{_prefix}/include/ngx_linux.h
%{_prefix}/include/ngx_linux_config.h
%{_prefix}/include/ngx_list.h
%{_prefix}/include/ngx_log.h
%{_prefix}/include/ngx_md5.h
%{_prefix}/include/ngx_murmurhash.h
%{_prefix}/include/ngx_open_file_cache.h
%{_prefix}/include/ngx_os.h
%{_prefix}/include/ngx_palloc.h
%{_prefix}/include/ngx_parse.h
%{_prefix}/include/ngx_pipe.h
%{_prefix}/include/ngx_proc.h
%{_prefix}/include/ngx_process.h
%{_prefix}/include/ngx_process_cycle.h
%{_prefix}/include/ngx_proxy_protocol.h
%{_prefix}/include/ngx_queue.h
%{_prefix}/include/ngx_radix_tree.h
%{_prefix}/include/ngx_rbtree.h
%{_prefix}/include/ngx_regex.h
%{_prefix}/include/ngx_resolver.h
%{_prefix}/include/ngx_segment_tree.h
%{_prefix}/include/ngx_setaffinity.h
%{_prefix}/include/ngx_setproctitle.h
%{_prefix}/include/ngx_sha1.h
%{_prefix}/include/ngx_shmem.h
%{_prefix}/include/ngx_shmtx.h
%{_prefix}/include/ngx_slab.h
%{_prefix}/include/ngx_socket.h
%{_prefix}/include/ngx_string.h
%{_prefix}/include/ngx_sysinfo.h
%{_prefix}/include/ngx_syslog.h
%{_prefix}/include/ngx_thread.h
%{_prefix}/include/ngx_time.h
%{_prefix}/include/ngx_times.h
%{_prefix}/include/ngx_trie.h
%{_prefix}/include/ngx_user.h
/usr/local/share/man/man3/nginx.3pm
%{_initrddir}/tengine
%doc /usr/local/nginx/html/index.html
%attr(0775,root,root) /etc/rc.d/init.d/nginx

%changelog
* Mon Jul 4 2016 Beijing <schangech@gmail.com>
- ver 2.1.2

 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM