2016-10-17 20 views
0

我寫了一個bash腳本來連續檢查服務。該腳本具有一些功能,並且還調用其他源bash文件,並在手動執行時正常工作。該腳本有一個連續的循環語句類似,OSX爲bash腳本執行創建launchd服務

while true; do 
{ 

$path/is_it_running 
if [ "$?" == "0" ]; then 
{ 
echo "yes, it is running" 
$path/test 
if [ "$?" != "0" ]; then 
fix_the_issues 
fi 
} 

else 
echo "It is not running!" 

fi 
sleep 10 
} 
done 

/Library/LaunchDaemons/my.own.service.plist:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
    <dict> 
     <key>Label</key> 
     <string>my.own.service</string> 
     <key>ProgramArguments</key> 
     <array> 
      <string>/bin/bash</string> 
      <string>/path/to/bash/script</string> 
     </array> 
     <key>RunAtLoad</key> 
     <true/> 
     <key>KeepAlive</key> 
     <true/> 
     <key>StandardOutPath</key> 
     <string>/var/log/my-service.log</string> 
    </dict> 
</plist> 

sudo launchctl load -w /Library/LaunchDaemons/my.own.service.plist

/var/log/system.log :

com.apple.xpc.launchd[1] (com.apple.quicklook[80608]): Endpoint has been activated through legacy launch(3) APIs. Please switch to XPC or bootstrap_check_in(): com.apple.quicklook 

問題是我現在面臨: 手動執行時,該腳本沒有正確運行。我可以說啓動觸發腳本,因爲我可以看到「是的,它正在運行」和「它沒有運行!」來自plist StandardOutPath日誌文件/var/log/my-service.log的消息。

任何人都可以幫助我成功運行bash腳本作爲服務嗎?不像debian/centos,我在osx上看起來很困難。順便說一下,這是OSX EI Captain和Sierra版本。

+0

嘗試在腳本開頭放置一個合適的shebang'#!/ bin/bash'並從參數數組中刪除'bash'。此外,嘗試縮進你的shell腳本,使其易讀並通過http://shellcheck.net運行它 –

+0

腳本文件在頂部和所有其他源文件中都有'#!/ bin/bash'。我可以刪除plist參數。如果它正在運行或沒有完美運行,它會迴應,但在服務運行或未運行時不會執行某些操作。我一直在測試這個腳本文件,它的工作原理就是我想要的。它在某處使用'sudo'來提示輸入密碼,我不認爲launchd等待這個回答,因爲它以root身份運行,是嗎? – user465465

回答

1

我下面的作品在OSX 10.10 bash腳本:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>Disabled</key> 
    <false/> 
    <key>EnvironmentVariables</key> 
    <dict> 
     <key>PATH</key> 
     <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin</string> 
    </dict> 
    <key>KeepAlive</key> 
    <dict> 
     <key>SuccessfulExit</key> 
     <false/> 
    </dict> 
    <key>Label</key> 
    <string>SomeNameHere</string> 
    <key>ProgramArguments</key> 
    <array> 
     <string>/bin/bash</string> 
     <string>/path/to/bash/script</string> 
    </array> 
    <key>RunAtLoad</key> 
    <true/> 
</dict> 
</plist> 

我用Lingon創建它。您也可以使用免費試用版來解決您當前的問題。

您需要使用4個版本:

需要的MacOS 10.11或更高版本(作品完美地與MacOS的10.12 塞拉利昂

+0

讓我試試這個! – user465465

+0

現在哇,它可能是環境變量的關鍵。但是,'launchctl list | stop | start'不工作,爲什麼? – user465465

+0

啓動和停止這些服務的任何技巧? – user465465

0

這是一種風格修復的bash反模式中你的腳本。我會將它作爲註釋發佈,但註釋不能包含代碼格式。

while true; do 
#{ no braces necessary here 
# note indentation 
    # Don't examine $? -- if already does that for you 
    if $path/is_it_running; then 
    #{ no braces necessary here 
    # note indentation 
     echo "yes, it is running" 
     # Don't examine $? -- if already does that for you 
     if $path/test; then 
      fix_the_issues 
     fi 

    #} No braces necessary  
    else 
     # Note indentation 
     echo "It is not running!" 
    fi 
    sleep 10 
#} No braces necessarsy 
done 

您可能還想訪問http://shellcheck.net/來自動檢查腳本。 (雖然它沒有檢查縮進,這純粹是爲了人類的可讀性。)