2012-08-11 191 views
2

我認爲這應該是直截了當的,但結果令我困惑。從bash腳本運行幾個命令

當我使用命令運行bash腳本,

sudo ./restartccpd.bash 

沒有出現在屏幕上。同時發行

sudo /etc/init.d/ccpd status 

獨立於屏幕運行腳本後產生空的,而不是顯示守護進程的pid。這證明只有pkill命令正在工作。

腳本的內容是,

#!/bin/bash 

sudo pkill -9 ccpd 
sudo /etc/init.d/ccpd start 
sudo /etc/init.d/ccpd status 

的命令正常工作從一個終端運行時。但是,如上所述,作爲腳本運行時,它不能按預期工作。

我試圖在命令之間插入睡眠命令,沒有任何效用。此外,syslog中沒有任何內容出現。所以,我無法診斷問題。

任何建議將不勝感激。

+1

你是說* *腳本失敗後,如果你鍵入這些命令,它的工作原理? – 2012-08-11 09:55:10

+0

我說的是三個命令,當從終端單獨運行時,工作。無論是在運行腳本之前還是之後。該腳本在任何情況下都不起作用。 – Masroor 2012-08-11 10:11:27

+0

如果你的腳本中沒有'sudo',它會起作用嗎? – 2012-08-11 10:28:59

回答

6

pkill將會在命令名稱中包含任何包含ccpd的內容。您的腳本被稱爲restartccpd.bash。首先第一行是:

pkill ccpd 

所以腳本啓動,運行pkill(其中不產生輸出),並迅速殺死自己。達達!

最簡單的解決方案是重命名腳本。你也可以這樣做:

kill $(pgrep -l ccpd | grep -v restartccpd | awk '{print $1}') 

這將產生proccess名稱和PID的匹配ccpd的列表,然後從列表中刪除restartccpd,然後用kill殺害的過程。

+0

'grep | awk'反成語可以重寫爲'awk'!/ restartccpd/{print $ 1}'' – tripleee 2012-08-11 14:30:52

+0

@larsks您的解決方案非常完美。任何想法爲什麼它也適用於bin/bash行被刪除?看到我上面的評論。 – Masroor 2012-08-11 14:39:19

+0

正確的診斷,但不是一個很好的解決方案。您的提案將殺死其名稱包含'ccpd'的任何其他進程。 'pkill'有'-x'選項就是爲了這個目的。 – Gilles 2012-08-11 14:55:50

0

由於larsks correctly diagnosed,殺死了名稱爲ccpd的所有進程。包括你的腳本。

立即解決的辦法是將-x選項傳遞給pkill,以便它只匹配名稱正好爲ccpd的進程。

請注意,如果您的腳本包含sudo命令,則不需要使用sudo調用它。或者,您可以從腳本中刪除所有sudo調用,並用sudo調用它。

但是,您不應該運行此腳本。您通常應該調用init腳本來關閉服務:/etc/init.d/ccpd stop。除了殺死守護進程外,這可能還會執行其他必要的清理,例如刪除臨時文件和鎖。唯一的情況是,您應該使用kill -9時,如果出現嚴重錯誤,導致/etc/init.d/ccpd stop失敗,那麼在重新啓動守護程序之前應手動進行必要的清理。

正確的方式做你想要做的是

sudo /etc/init.d/ccpd restart 

(假設你的發行版採用了傳統的SysVinit - 如果它使用的暴發戶,你應該運行sudo service ccpd restart代替)。

+0

我完全明白,我不想以這種方式重新啓動一個守護進程,相反這樣做是不可原諒的罪。但是,我們正在談論守護進程有其自身問題的特定情況。如果你想知道這種情況,你會想要訪問這個網站(http://radu.cotescu.com/how-to-install-canon-lbp-printers-in-ubuntu/)或特別是這個評論(http: //radu.cotescu.com/how-to-install-canon-lbp-printers-in-ubuntu/#comment-578224454)。 – Masroor 2012-08-11 22:11:58

+0

@MMA我只是剔除了線程,但我認爲在這裏做的正確的事情是修復'/ etc/init.d/ccpd'。作爲最後的手段,使用'pkill -x'。你有沒有試過問如何使這個打印機在[ubuntu.se]上工作? – Gilles 2012-08-12 18:08:02