2015-09-16 78 views
0
from crontab import CronTab 

tab = CronTab() 
cmd1 = 'actual command' 

cron_job = tab.new(cmd) 
cron_job.minute.every(1) 
cron_job.enable() 
tab.write_to_user(user=True) 

我試過使用minute.at(1)在第一分鐘運行,但我不知道什麼是在固定時間運行命令的正確方法(上午6點),只有一次..我知道「每一個」最終都會重複它,但我不想那樣。需要注意的是我需要使用python-crontab。使用python-crontab運行一個cronjob只有一個

回答

0

crontab的語法是:mm hh dd mt wd。因此,要在每天早晨6點設置它,將會是00 06 * * *,意思是任何一天,一個月,一個工作日的06:00(24小時)。如果我指的是documentation正確的,這應該工作:

from crontab import CronTab 

tab = CronTab() 
cmd1 = 'actual command' 

cron_job = tab.new(cmd) 
cron_job.setall('00 06 * * *') 
cron_job.enable() 
tab.write_to_user(user=True) 
+0

Thanks @heinst但是我想在早上6點運行一次,而不是每天早上6點運行一次。 – adhawan

0

而linux cron命令是專門爲定期運行命令,而在命令一次運行的工作,雖然也可以使用如果該命令重新提交,則反覆運行命令。我不知道配置一個cron條目只能執行一次的正常方法,並且找不到任何可能的文檔。通過執行'crontab -e'來編輯crontab文件,然後在編輯器中刪除作業的條目,或者使用'crontab </crontab文件覆蓋crontab文件中的所有內容, dev/null'或者完全用'crontab -r'去除crontab文件。

考慮到這一點,導致我發明了自毀cron作業,它是這樣的。假設你使用用戶名'adhawan'來配置一個cron作業。所有這一切,使工作自毀需要的是使用出發,按照作業的腳本中的最後聲明:

crontab -r 

這將刪除你的crontab文件,並應工作,因爲你的個人cron作業,你運行。我用下面的工作嘗試它和它的工作如預期 - 跑一次,然後刪除自身!:

* * * * * echo hello > /var/tmp/cron1; crontab -r 

如前所述,在Linux/Unix的實用程序提供了在計劃的時間運行一次的東西的一種手段。時間被稱爲timepec(時間分類)。例如,要安排工作,早上6點明天只運行一次,下面的timespec可以用來

6 am tomorrow 

或在上午6點到做它在9月18日可用於

6am Sep 18 
以下

或指定年份

6 am 9/18/2015 

at的timespec語法非常靈活。使用最近的術語,它可以被稱爲DSL(領域特定語言)。它是用YACC(另一個編譯器編譯器)實現的,它的語法縮減版本可以在其通常安裝在/ usr/share/doc/at */timespec的timespec文件中看到,在線有它的副本Abbreviated version of the yacc grammar used by at(1)

at可以從文件運行提供的工作,提供它的執行與-f選項或從標準輸入。例如從名爲atjob文件:

at -f atjob 6 am Sep 18 

或與重定向標準輸入從文件:

at 6 am Sep 18 < atjob 

或從管道標準輸入:

cat atjob | at 6 am 9/18 

嘗試使用在自命令行首先在不久的將來安排一個命令,就像現在或者一分鐘一樣,所以你可以看到它是否工作,並且用一個非常簡單的命令產生一些可觀察的命令,例如新文件。例如,第一個測試工作可以是'echo hello>/tmp/atfile01',並且可以像這樣提交作業的第一個測試:

echo「echo hello>/tmp/atfile01」現在運行

運行後,檢查/ tmp/atfile01是否存在,以及它是否證明at系統在運行。

然後嘗試SHEDULING工作到早上6點09月18運行(或幾天從現在開始,如果今天是年09月18或使用你的timespec)與

回聲「回聲你好>的/ tmp/atfile02」 |在09年9月18日

如果這沒有產生錯誤,那麼它的工作,它可以通過運行atq確認,看看它是否列出一個計劃爲YYYY-09-18 06:00的工作,其中YYYYY是如果今年的9/18已經過去了,那麼今年或明年將會如此。

現在您已經知道如何編寫和運行作業,並且使用atq從atrm隊列中刪除任何測試作業以列出作業(包括其ID),然後在ID上執行atrm會很好。例如,假設ID是2,第10和17 ATRM命令是:

atrm 2 10 17 

現在修改你的工作的命令,以滿足您的用途和使用subprocessshenvoy從Python的執行它。使用suprocess的例子是Calling an external command in Python

有關更多信息,您可以通過運行「man at」和Ubuntu的聯機幫助頁來查看其手冊頁,其格式爲at.1posix.html

+0

謝謝@Tris Nefzger。因此,python-crontab不能做到這一點...類似於:cron_job.hour.at(24)? – adhawan

+0

@adhawan:當然你可以在cron作業中設置一個作業,你可以使用cron作業刪除一個cron作業,但最後還是有一個cron作業等待再次執行。然而,我想出了一個辦法去做你想做的事 - 自毀的cron工作。這在我的答案的第二段中有解釋。 –

+0

謝謝@Tris Nefzger ...它的工作! – adhawan

相關問題