2014-09-25 153 views
0

我想從cron運行Python腳本。我使用crontab作爲用戶而不是root來運行命令。我的Python腳本在頂部#! /usr/bin/env python有shebang,我做了chmod +x它使腳本可執行。Python腳本沒有在cron中運行

該腳本在從shell運行但不使用crontab時不起作用。我沒有檢查/var/log/cron文件,看到腳本運行,但從stdoutstderr打印任何地方都沒有。

最後,我做了一個小腳本,它打印日期和一個字符串,並稱每分鐘都有效,但這個腳本沒有。我不知道爲什麼我收到這些變化的結果...

這是我在crontab

SHELL=/bin/bash 



#min #hour day-of-month month day-of-week  command 
#------------------------------------------------------------------------- 
*/5  *  *    *  *    /path/to/script/script.py 

這裏條目我的腳本的源代碼不會從crontab中運行,但會從運行它在被調用的時候就像是這樣的./script.py。該腳本是可執行的我用chmod +x命令後,就可以了,順便說一句...:

#! /usr/bin/env python 

#create a file and write to it 
import time 

def create_and_write(): 
    with open("py-write-out.out", "a+") as w: 
     w.write("writing to file. hello from python. :D\n") 
     w.write("the time is: " + str(time.asctime()) + "\n") 
     w.write("--------------------------------\n") 


def main(): 
    create_and_write() 

if __name__ == "__main__": 
    main() 

編輯 我想通了什麼事情錯了。我需要將絕對文件路徑放在腳本中,否則它會寫入我沒有計劃的某個目錄。

+0

請包括相關的代碼 - 這將幫助我們回答。 – l0b0 2014-09-25 23:01:48

+0

在可能影響腳本的shell環境之間經常會有其他差異:不同的'PYTHONPATH'是一種可能性。您可能希望在'cron'下運行一個腳本,該腳本只是打印其環境,並將其與基於shell的手動執行的期望進行比較。 – 2014-09-25 23:42:56

+0

你重定向stdout和stderr嗎?你期望看到它們出現在哪裏? – cdarke 2014-09-26 04:59:47

回答

3

可以將此自己通過以下步驟解決:

  1. 修改的cron爲/path/to/script/script.py > /tmp/log 2> &1
  2. 現在,讓cron運行
  3. 現在讀文件/tmp/log
  4. 你會發現在您面臨的問題的原因,以便您可以修復它。

以我的經驗,問題主要是與環境有關。
在cron中,env變量未設置。所以你可能必須在cron中明確地設置腳本的env。

+1

我盡力而爲,並沒有奏效。我在'/ tmp/log'中創建了這個文件,但是沒有寫在那裏。另外,我認爲使用'&>>'是將'stderr'和'stdout'寫入文件的更好選擇。 ;) – user3870315 2014-09-26 17:15:17

+0

你的腳本是否在控制檯上打印了一些東西?當你說日誌文件是空的時,我無法相信。有兩種情況:'1.'在運行腳本時shell可能報告了一些錯誤。然後應該在文件中顯示錯誤。 '2。'你的腳本應該展示了一些東西,如果有的話。 – cppcoder 2014-09-27 01:38:45

+1

我做了一個類似的腳本,它只寫入日誌文件,但沒有做我最初想要的。它應該調用另一個程序運行,但它不會這樣做。它甚至不打印任何錯誤信息或任何東西... 0_o – user3870315 2014-10-01 22:46:03

2

好的,我想這個主題仍然會幫助谷歌。
我使用解決方法來運行帶有cron作業的python腳本。事實上,python腳本需要用cron job謹慎處理。
所以我讓一個bash腳本來處理所有這些。
我創建了一個bash腳本,它具有運行python腳本的命令。然後我安排一個cron作業來運行bash腳本。您甚至可以使用重定向器來記錄執行python腳本的bash命令的輸出。
例如

@reboot /home/user/auto_delete.sh 

auto_delete.sh可能包含以下行: -

#!/bin/sh 
echo $(date) >> bash_cron_log.txt 
/usr/bin/python /home/user/auto_delete.py >> bash_cron_log.txt 

所以我不」不用擔心Cron作業的Python腳本崩潰。

+0

有趣。我可以嘗試。 :) – user3870315 2016-08-11 14:55:01

+0

不錯!這對我有用 - 我只需確保我的所有路徑名都是在python腳本和bash命令中顯式的。 – Trev14 2017-03-29 22:06:31

0

另一個原因可能是我們判斷執行或不執行的方式是錯誤的。