2016-02-23 153 views
2

我正在嘗試systemd第一次。我想在系統啓動時啓動一個進程。我在啓動和運行時遇到問題。systemd:SIGTERM啓動後立即

systemd應運行一個腳本(start.sh)。該腳本在後臺啓動一個進程(讓我們稱它爲P),並以代碼0退出。 P一直運行直到發生信號。

如果我手動運行start.sh,一切正常。

如果我讓它由systemd啓動P立即在啓動SIGTERM後立即終止。

所以它開始,但信號呢? 它終止P,我不確定它的起源和原因。

也許我的單位是錯的,但我不知道如何設置它以滿足我的需求。 我嘗試過服務型簡單,閒置和onehot。

感謝您的幫助! Chris

這是我的單位。

[Unit] 
Description=Test 
After=sshd.service 

[Service] 
Type=oneshot 
ExecStart=/home/max/start.sh start 
Restart=no 
User=root 
SuccessExitStatus=0 

[Install] 
WantedBy=multi-user.target 

那就是狀態。

Loaded: loaded (/etc/systemd/system/test.service; enabled) 
Active: inactive (dead) since Die 2016-02-23 20:56:59 CET; 20min ago 
Process: 1046 ExecStart=/home/max/test.sh start (code=exited, status=0/SUCCESS) 

回答

3

當start.sh完成,systemd在同一cgroup中殺死一切,start.sh

的選項有:

  • 在Unit區設置KillMode處理(默認是控制組)。這將導致systemd只會殺死它直接啓動的進程。

  • 不使start.sh在後臺啓動和退出的東西,但在前臺

我想在您的情況選擇2是可行的,更直接的就在那裏執行它。

來源:https://unix.stackexchange.com/a/231201/45329

+0

的問題是,該腳本需要啓動多個進程。並且所有的都是平行的。 我試圖保持我的示例簡單,所以我沒有提到它。 – chris01

+0

謝謝! KillMode做了詭計。 – chris01

1

雖然改變KillModeprocess像下面會在你的情況下工作,它不是推薦的解決方案。

[Service] 
KillMode=process 
... 

KillMode集中的問題processsystemd在它啓動的過程中所有的孩子失去了控制。這意味着,如果發生任何事情,並且您的某個流程因某種原因不會死亡,它將繼續徘徊。

在你的情況下,更好的解決方案是創建所有的進程,keep their pid然後wait

您在shell腳本中使用的等待命令可能因您使用的shell(我建議的鏈接是用於bash)而異。讓shell腳本等待所有孩子的效果與在前臺啓動一個不會分離的孩子相同。

因此,像這樣,或多或少:

#!/bin/bash 

# Start your various processes 
process1 & 
PROCESS1_PID=$! 
process2 & 
PROCESS2_PID=$! 
process3 & 
PROCESS3_PID=$! 

# Wait on your processes 
wait $PROCESS1_PID $PROCESS2_PID $PROCESS3_PID 

# OR, if I'm correct, bash also allows you to wait on all children 
# just a plain wait like so: 
wait 

# reach here only after children 1, 2, and 3 died