2016-08-01 42 views
2

我有簡單bash腳本,在終端工作手冊,但cron的後給出了一個空的可變運行。運行的cron後擊空可變的,但手動

#!/bin/bash 
gwip=`/usr/bin/nmcli dev list iface eth0 | grep IP4-SETTINGS.GATEWAY: | awk '{ print $2}'` 
printf '%s\n' "$(date) =- $gwip -= " >> /var/log/looog.log 

運行:/bin/bash /test.bash

輸出文件/var/log/looog.log:

1 monday 2016 14:17:36 +0300 =- 23.18.117.254 -= 

當我通過cron運行,變量是空的。

*/1 * * * * root /bin/bash /test.bash 

輸出文件/var/log/looog.log:

1 monday 2016 14:19:13 +0300 =- -= 

爲什麼變量$ gwip是空的?如何解決它?

回答

3

合格/usr/bin/nmcli是不夠的 - 您還需要從PATH中找到一堆其他工具。

而且,一般而言 - 調試一個cron作業時,安排其標準錯誤去到一個文件中,就像這樣:

#!/bin/bash 

# log stdout and stderr to two different files 
exec >>/var/log/looog.log 2>>/var/log/looog.err.log 

# ...and log every command we try to execute to stderr (aka looog.err.log) 
set -x 

# set a PATH variable 
export PATH=/bin:/usr/bin 

# original code here, using modern POSIX $() syntax, vs old hard-to-nest `` 
gwip=$(nmcli dev list iface eth0 | awk '/IP4-SETTINGS[.]GATEWAY:/ { print $2}') 
printf '%s\n' "$(date) =- $gwip -= " 

這裏的關鍵事情是明確設置PATH(沒有在PATH中設置的值是cron作業中的一個常見問題)和stderr日誌(通過讀取其內容確保可以識別任何其他問題)。

注意使用單一重定向到looog.log的前期。這並不讓當你從字面上只運行一個打印語句顯著差異,但如果你會擴展這個腳本有一個以上的,它的效率更高,以打開輸出文件只有一個,而不是重新打開它的每一個你有時間寫點東西。

+0

我在looog.err.log錯誤:**(過程:11885):WARNING **:nm_client_get_devices:錯誤越來越設備:未收到回覆。可能的原因包括:遠程應用程序未發送回覆,消息總線安全策略阻止回覆,回覆超時過期或網絡連接中斷。 錯誤:未找到設備'eth0'。 –

+1

嗯,這是你的錯誤。爲什麼'nmcli'將不會從您的系統上運行的cron是不是真的有很大的StackOverflow問題 - 它一定會是一個事實深入調查 - 但我會通過看是否已啓用SELinux的開始。如果您將其設置爲許可但記錄模式,則可以讓您找出哪些權限是必需的但不可用。 –

+0

......該錯誤使得它相當清楚地表明慶典正在它甚至從cron應有的方式,這樣的話你沒有一個變量捕獲的問題,對不對?這裏有問題的其他子集嗎? –

相關問題