1. 程式人生 > >Linux Guard Service - 進程分裂與脫離

Linux Guard Service - 進程分裂與脫離

strdup 命令 value hat 解決 turn 方法 ice mct

進程分裂更名

void set_ps_name(char *name) {
    prctl(PR_SET_NAME, name);
}

修改進程長名稱

  1. 備份進程環境變量空間

    for (i = 1; i < argc; i++) {
        argv_new[i] = strdup(argv[i]);
    }
    char **new_environ = malloc(env_len * sizeof(char *));
    
    if (environ) {
        unsigned int i = -1;
        while (environ[++i])
            new_environ[i] = strdup(environ[i]);
    }
  2. 寫入進程長名稱

    sprintf(argv[0], name);
  3. 還原進程環境變量

    //      for(i=1; i<argc; i++){
    //              sprintf(argv[i],argv_new[i]);
    //      }
    
    //      for(i=0; i<env_len;i++){
    //              sprintf(environ[i],new_environ[i]);
    //      }

進程殺死後自動恢復

  1. 等級子進程的PID

    void add_index(char **index, int i, pid_t pid) {
        index[i] = (char *) malloc(sizeof(char) * 10);
        sprintf(index[i], "%d", pid);
    }
  2. 每隔一秒檢查一次所有進程,為已經死亡的進程重新分裂並登記

    char sub_name[50] = "/proc/0000000/cmdline";
    sprintf(sub_name, "/proc/%s/cmdline", pid);
    FILE *cmdline = fopen(sub_name, "r");
    if (!cmdline) {
        return 0;
    }
    --------------------------------------------
    if (pid == 0) {
        return i;
    } else {
        sprintf(index[i], "%d", pid);

父進程死亡後子進程自動結束

waitpid(-1, NULL, WNOHANG);

Service 的編寫方法

[Unit]
Descryption=

[Service]
Type=forking
ExecStart=/usr/sbin/

[Install]
WantedBy=multi-user.target

Systemd 默認從目錄

/etc/systemd/system/

讀取配置文件。但是,裏面存放的大部分文件都是符號鏈接,指向目錄

/usr/lib/systemd/system/

真正的配置文件存放在那個目錄。

systemctl enable命令用於在上面兩個目錄之間,建立符號鏈接關系。

使用multi-user.target控制後,system enable自動向啟動段註冊該服務

結果

啟動服務

root      19924      1  0 00:47 ?        00:00:00 ./test [main] 00:00:05
root      19925  19924  0 00:47 ?        00:00:00 ./test [sub-01] 00:00:19
root      19927  19924  0 00:47 ?        00:00:00 ./test [sub-02] 00:00:18
root      19928  19924  0 00:47 ?        00:00:00 ./test [sub-03] 00:00:17
root      19930  19924  0 00:47 ?        00:00:00 ./test [sub-04] 00:00:16
root      19931  19924  0 00:47 ?        00:00:00 ./test [sub-05] 00:00:15
root      19932  19924  0 00:47 ?        00:00:00 ./test [sub-06] 00:00:14
root      19934  19924  0 00:47 ?        00:00:00 ./test [sub-07] 00:00:13
root      19935  19924  0 00:47 ?        00:00:00 ./test [sub-08] 00:00:12
root      19936  19924  0 00:47 ?        00:00:00 ./test [sub-09] 00:00:11
root      19937  19924  0 00:47 ?        00:00:00 ./test [sub-10] 00:00:10
root      19938  19924  0 00:47 ?        00:00:00 ./test [sub-11] 00:00:09
root      19940  19924  0 00:47 ?        00:00:00 ./test [sub-12] 00:00:08
root      19941  19924  0 00:47 ?        00:00:00 ./test [sub-13] 00:00:07
root      19950   1090  0 00:47 ?        00:00:00 sleep 60
root      19951  19924  0 00:47 ?        00:00:00 ./test [sub-14] 00:00:06
root      19953  19924  0 00:47 ?        00:00:00 ./test [sub-15] 00:00:05

RPM打包樹

./rpmbuild
|-BUILD
|-RPM
|-SOURCES
|-SPECS
|-SPRMS

RPM SPEC文件寫法

tagname: value

支持宏 %define

%轉義字符%%

定義包的名稱

name:tair

版本號

version:1.0

build路徑

buildroot: %{_tmppath}/%{name}-%{version}-root

指定源代碼

source:tair-1.0.src.tar.gz

構建前

%prep
%setup -q

將切換到構建所在的目錄,通常是/usr/src/redhat/BUILD,然後解壓,以包名命名的子目錄

構建

%build
...(構建指令)
make

安裝

%install
make install PREFIX=$RPM_BUILD_ROOT/usr/local

清理

%clean
rm -rf $RPM_BUILD_ROOT

指定文件列表

%file
...

前綴和後綴段

%pre為安裝前執行
%post為安裝後執行
%preun為卸載前執行
%postun為卸載後執行

註意

%files段自動將環境切換至

$RPM_BUILD_ROOT

即使寫為/usr/等絕對路徑,rpmbuild時依然會視為相對路徑

解決
install -d $RPM_BUILD_ROOT/
cp -a * $RPM_BUILD_ROOT/

%install段是為%files段做準備用的,因此在環境切換之前,cp -a把所有文件拷貝到BUILDROOT中,因此%files段直接改寫為/*,可以避免找不到路徑的問題

結果

安裝

檢查未打包文件:/usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/test-1552227-1.0-1.0.x86_64
寫道:/root/rpmbuild/SRPMS/test-1552227-1.0-1.0.src.rpm
寫道:/root/rpmbuild/RPMS/x86_64/test-1552227-1.0-1.0.x86_64.rpm
執行(%clean): /bin/sh -e /var/tmp/rpm-tmp.V0GhQK
+ umask 022
+ cd /root/rpmbuild/BUILD
+ rm -rf /root/rpmbuild/BUILDROOT/test-1552227-1.0-1.0.x86_64
+ exit 0
cp /root/rpmbuild/RPMS/x86_64/*.rpm ./test-1552227.rpm
[root@localhost 1552227-000106]# rpm -ivh test-1552227.rpm 
準備中...                             ################################# [100%]
準備安裝test-1552227
正在升級/安裝...
   1:test-1552227-1.0-1.0             ################################# [100%]
完成安裝test-1552227
[root@localhost 1552227-000106]# 

卸載

[root@localhost 1552227-000106]# rpm -e test-1552227
準備卸載test-1552227
完成卸載test-1552227
[root@localhost 1552227-000106]# 

makefile編寫方法

調用rpm

為rpm建立打包樹,把文件壓縮後放入SOURCES

mkdir -p $(RPM_SYS_PATH){BUILD,SOURCES,SPECS,SPRMS,RPMS}
tar -zcvf $(S_NAME).tar.gz $(S_NAME)
cp $(S_NAME).tar.gz $(RPM_SYS_PATH)SOURCES/

調用rpmbuild

rpmbuild -ba $(ME).spec

/usr/1552227文件夾非空時保留

rmdir /usr/1552227

rmdir不會刪除非空文件夾

向文件寫入學號姓名

echo "1552227劉天辰">1552227.dat

Linux Guard Service - 進程分裂與脫離