天天看點

systemd程序啟動管理實驗(Ubuntu18.04)systemd程序啟動管理實驗(Ubuntu18.04)

目錄

  • 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;
}