2013-06-25 70 views
0

我在AIX 5.3上有一個啓動Shell腳本(ksh)的程序(C++ Executable)。孤兒(ksh Shell腳本在CTRL-X時不會先終止)

當我啓動程序和shell腳本,我看到兩個進程

AIX:>ps -ef | grep 3657892 
u001 **3657892** 3670248 0 18:16:34 pts/11 0:00 /u0012006/bin/Launcher 
u001 3723398 **3657892** 0 18:16:41 pts/11 0:00 /usr/bin/ksh /u0012006/shell/Trjt_Slds.sh -m 

現在,當我在鍵盤上一個CTRL-X組合鍵結束,走出去的shell腳本中,當shell腳本繼續執行時,主啓動程序(C++ Executable)進程被終止。

AIX:>ps -ef | grep 3723398  
u001 3723398  1 106 18:16:41 pts/11 0:01 /usr/bin/ksh /u0012006/shell/Trjt_Slds.sh -m 
u001 3731504 3723398 0     0:00 <defunct> 
u001 3735612 3723398 0     0:00 <defunct> 
u001 3739838 3723398 0     0:00 <defunct> 

這會導致CPU消耗達到100%,並導致很多停用的進程啓動。

當我執行CTRL-X時,有沒有辦法讓AIX Shell腳本第一次終止?

+0

你能提供的shell腳本的代碼片段,或者關於它的作用?在某些情況下,簡單地使用'exec program''可以通過完全消除shell進程來解決這個問題。 –

+0

@RudyMatela感謝您的輸入。不幸的是用C++編寫的Launhcer程序不能改變。我可以改變腳本。該腳本本身在一個無限循環中運行,詢問我從用戶那裏獲得的參數,並查詢Oracle DB並獲取結果並顯示給用戶,並在循環中繼續。我已經在http://dpaste.com/1271101/上粘貼了一個可能感興趣的代碼片段。這只是代碼片段的一部分,並且代碼循環完成了我上面指出的內容。 – Guddu

回答

1

注意:啓動器壞了,應該修復。因此,任何「解決方案」將是一個黑客。

一個想法是在腳本的各個位置檢查$ PPID。如果它設置爲1(init),則退出腳本。

我不明白使用control-X。這不會產生任何tty信號。我想這就是你想要的。也許tty也處於原始模式。但是您可能會考慮將控制-X掛接到SIGINT等各種tty信號之一。例如stty intr ^X但您還需要記住將其與stty intr ^C

取消它最後,您可以將腳本包裝在腳本中,並使用該技術殺死孩子並退出。例如(未經測試)

#!/bin/ksh 
# launch original program in background 
/path/to/real/program "[email protected]" & 
# get child's pid 
child=$! 

while : ; do 
    # when we become an orphan 
    if [[ $$PPID -eq 1 ]] ; then 
    # kill the child and exit 
    kill $child 
    exit 
    fi 
    # poll once a second 
    sleep 1 
done 

更新

./s1是:

#!/bin/ksh 

./s2 & 
sleep 10 
exit 

./s2是:

#!/bin/ksh 

while : ; do 
    if kill -0 $PPID ; then 
    echo still good 
    else 
    echo orphaned 
    exit 
    fi 
    sleep 1 
done 
+0

你總結得很好。我將考慮將CTRL-X映射到SIGINT。我將保存原始的術語設置並在退出時恢復它。我現在在我的測試環境中試用這個。 – Guddu

+0

不幸的是,$ PPID始終保留爲原始父進程ID,並且對於孤立進程不會更改爲1 – Guddu

+0

您是對的......這是最不幸的。我在原來的文章中加入編輯 – pedz