目錄
- systemd程序啟動管理實驗(Ubuntu18.04)
-
- 參考資料
- 實驗1
-
- 1.建立二進制檔案
- 2.建立腳本
- 3.建立service配置檔案
- 4.執行
- 5.kill程序
- 實驗2
-
- 1.建立二進制檔案
- 2.建立腳本
- 3.建立service配置檔案
- 4.執行
- 5.kill程序
- 實驗3
-
- 1.建立二進制檔案
- 2.建立腳本
- 3.建立service配置檔案
- 4.執行
- 5.結果
- 其他錯誤導緻程序崩潰
-
- 越界
- 棧溢出
- 數值溢出
systemd程序啟動管理實驗(Ubuntu18.04)
參考資料
systemd入門教程:指令篇
systemd入門教程:實戰篇
實驗1
實驗環境:ubuntu18.04虛拟機
流程:利用systemd,執行一個腳本,進而建立程序A運作一個無限循環二進制檔案。将程序A殺死,systemd經過規定的一段時間後,重新啟動同一腳本,建立程序B運作同一個無限循環二進制檔案。
1.建立二進制檔案
建立
main.c
:
#include <stdio.h>
int main()
{
//printf("start a!\n");
while(1);
return 0;
}
編譯成
main.out
:
gcc main.c -o main.out
2.建立腳本
腳本
demo.local
:
#!/bin/bash
/home/lzw/systemd_test/main.out
将腳本中的路徑改為自己電腦中main.out的路徑,注意要用絕對位址。如果自己電腦的SHELL不是bash也要改掉。
3.建立service配置檔案
SystemD的配置檔案位于
/etc/systemd/system
,在此目錄下建立檔案
demo.service
:
[Unit]
Description=test server daemon
[Service]
ExecStart=/home/lzw/systemd_test/demo.local #該服務的啟動腳本路徑
ExecReload=/bin/kill -HUP $MAINPID
Type=simple
Restart=on-failure
RestartSec=10s
[Install]
WantedBy=multi-user.target
ExecStart的路徑修改為自己電腦中的路徑,注意要絕對位址。其他參數含義請檢視參考資料
4.執行
激活開機啟動,會建立service檔案的軟連結到
/etc/systemd/system/multi-user.target.wants
:
sudo systemctl enable demo.service
之後重新啟動系統就可以自動運作main.out。
也可以不重新開機直接運作,繼續執行如下指令:
sudo systemctl daemon-reload #重新加載配置檔案
sudo systemctl start demo #啟動demo服務
如需多次改動service配置檔案,可以建立一個腳本,每次改動後直接執行:
#!/bin/bash
sudo systemctl stop demo.service
sudo systemctl daemon-reload
sudo systemctl restart demo
注意在demo還在運作時,不要改動service配置檔案。
5.kill程序
用
ps -ef
指令檢視main.out程序結果:
UID PID PPID C STIME TTY TIME CMD
...
root 11887 1 0 14:26 ? 00:00:00 /bin/bash /home/lzw/systemd_test/demo.local
root 11888 11887 99 14:26 ? 00:00:01 /home/lzw/systemd_test/main.out
...
可以看到腳本程序為父程序,啟動了main.out子程序。
用
sudo kill 11888
将main.out程序殺死,會發現兩個程序都不見了。
等待10秒後,再次檢視程序,可以看到兩個程序又出現了,并且程序号不同。
實驗2
實驗環境:ubuntu18.04虛拟機
流程:利用systemd,執行一個腳本,進而建立程序A運作一個無限循環二進制檔案。将程序A殺死,systemd自動啟動另一腳本,建立程序B運作另一個無限循環二進制檔案。
1.建立二進制檔案
建立
main.c
:
#include <stdio.h>
int main()
{
//printf("start a!\n");
while(1);
return 0;
}
編譯成
main1.out
和
main2.out
:
gcc main.c -o main1.out
gcc main.c -o main2.out
2.建立腳本
程序A的腳本
demo1.local
:
#!/bin/bash
/home/lzw/systemd_test/main1.out
程序B的腳本
demo2.local
:
#!/bin/bash
/home/lzw/systemd_test/main2.out
将腳本中的路徑改為自己電腦中main1.out和main2.out的路徑,注意要用絕對位址。如果自己電腦的SHELL不是bash也要改掉。
3.建立service配置檔案
SystemD的配置檔案位于
/etc/systemd/system
,在此目錄下建立檔案
demo.service
:
[Unit]
Description=test server daemon
[Service]
ExecStart=/home/lzw/systemd_test/demo1.local #該服務的啟動腳本
ExecStopPost=/home/lzw/systemd_test/demo2.local #該服務停止後的執行腳本
ExecReload=/bin/kill -HUP $MAINPID
Type=simple
[Install]
WantedBy=multi-user.target
ExecStart和ExecStopPost的路徑修改為自己電腦中的路徑,注意要絕對位址。其他參數含義請檢視參考資料
4.執行
#!/bin/bash
sudo systemctl stop demo.service
sudo systemctl daemon-reload
sudo systemctl restart demo
5.kill程序
用
ps -ef
指令檢視main1.out程序結果:
UID PID PPID C STIME TTY TIME CMD
...
root 11356 1 0 14:29 ? 00:00:00 /bin/bash /home/lzw/systemd_test/demo1.local
root 11357 11356 99 14:29 ? 00:00:01 /home/lzw/systemd_test/main1.out
...
用
sudo kill 11357
将main1.out程序殺死,再次檢視程序:
UID PID PPID C STIME TTY TIME CMD
...
root 11712 1 0 14:30 ? 00:00:00 /bin/bash /home/lzw/systemd_test/demo2.local
root 11713 11712 99 14:30 ? 00:00:01 /home/lzw/systemd_test/main2.out
...
發現main1.out的兩個程序不見了,取而代之的是main2.out的兩個程序。
實驗3
實驗環境:ubuntu18.04虛拟機
流程:服務A運作一個二進制檔案,作用是延時100秒。等延時結束後,才啟動服務B,執行一句ECHO指令。
1.建立二進制檔案
建立
pro_a.c
:
#include <stdio.h>
int main()
{
sleep(100);
return 0;
}
編譯成
pro_a.out
:
gcc pro_a.c -o pro_a.out
2.建立腳本
程序A的腳本
demo1.local
:
#!/bin/bash
/home/lzw/systemd_test/pro_a.out
程序B的腳本
demo2.local
:
#!/bin/bash
/bin/echo 111>>/home/lzw/systemd_test/echo
并且在
/home/lzw/systemd_test/
建立一個echo空檔案。
将腳本中的路徑改為自己電腦中main1.out和main2.out的路徑,注意要用絕對位址。如果自己電腦的SHELL不是bash也要改掉。
3.建立service配置檔案
systemd的配置檔案位于
/etc/systemd/system
,在此目錄下建立檔案
test_3_a .service
:
[Unit]
Description=test_3_a server daemon
[Service]
ExecStartPre=/home/lzw/systemd_test/test_3/demo.local
ExecStart=/bin/kill -HUP $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
Type=simple
[Install]
WantedBy=multi-user.target
ExecStart和ExecStopPre的路徑修改為自己電腦中的路徑,注意要絕對位址。其他參數含義請檢視參考資料
建立檔案
test_3_a .service
:
[Unit]
Description=test_3_b server daemon
After=test_3_a.service
[Service]
ExecStart=/home/lzw/systemd_test/test_3/demo_b_1.local
ExecReload=/bin/kill -HUP $MAINPID
Type=simple
[Install]
WantedBy=multi-user.target
4.執行
sudo systemctl enable test_3_a.service
sudo systemctl enable test_3_b.service
sudo systemctl daemon-reload
sudo systemctl start test_3_a
sudo systemctl start test_3_b
5.結果
程序pro_a.out出現并一直持續100秒,期間echo檔案并沒有被改變。
直到100秒結束,程序pro_a.out被kill,這時echo檔案出現
111
的值,說明服務B被啟動。
其他錯誤導緻程序崩潰
越界
out_of_range.c:
#include <stdio.h>
int main()
{
int a[2]={0,0};
*(volatile int *)(0x80000000) = a[3];
while(1);
return 0;
}
棧溢出
stack_overflow.c:
#include <stdio.h>
void F(int n)
{
F(n);
}
int main()
{
F(1);
while(1);
return 0;
}
數值溢出
arithmetic_overflow.c
#include <stdio.h>
int F(int n)
{
return n*F(n-1);
}
int main()
{
F(100);
while(1);
return 0;
}