Linux Guard Service - 進程分裂與脫離
阿新 • • 發佈:2018-03-04
strdup 命令 value hat 解決 turn 方法 ice mct
進程分裂更名
void set_ps_name(char *name) {
prctl(PR_SET_NAME, name);
}
修改進程長名稱
備份進程環境變量空間
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]); }
寫入進程長名稱
sprintf(argv[0], name);
還原進程環境變量
// 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]); // }
進程殺死後自動恢復
等級子進程的PID
void add_index(char **index, int i, pid_t pid) { index[i] = (char *) malloc(sizeof(char) * 10); sprintf(index[i], "%d", pid); }
每隔一秒檢查一次所有進程,為已經死亡的進程重新分裂並登記
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 - 進程分裂與脫離