分類
科技

【程式筆記】Linux Cron Python Code 無法正常運作

最近在練習寫一些小型 side project,放在 Linode 上面運作。

自從 ChatGPT 問世之後,就花比較多時間透過 ChatGPT 寫 Code。畢竟我本來想要寫 Code 的主要因素,就是希望能寫一些自己喜歡、也覺得有意義的線上服務,寫程式本身不算我特別熱愛的事物。

不過才剛開始寫第一個 side project 就遇到問題。花了一點時間解開問題,也把找到的解方寫下來。一方面覺得未來說不定還會用到,二方面如果有遇到相同狀況的人,也說不定能透過這篇文章找到解答。(三方面,這也會成為 ChatGPT-8 之類拿來訓練的資料?)

我遇到的問題是這樣:我的服務放在 Linux Debian 11 的虛擬伺服器上,我想要用 Linux 的 Cron 功能,幫我每個小時執行一次我的 Python Script。這個 Script 會利用 Selenium 將某個網站截圖後,把圖片存在一個網路可以存取的地方。

我手動執行下述的程式碼可以運作:

* * * * * /usr/bin/python3 /full/path/to/screenshot.py

但放到 Cron 的機制就無法動彈。

後來陸續跟 ChatGPT Debug,解了幾個問題,像是:

1.Cron 的排程工作會需要寄信提供結果,但我一開始沒有設定。(我後來的處理方式是參考這篇,直接修改 cron 的設定,讓他寄到虛空之中)

2.原來若要執行 cron 的話,需要讓 python script 裡面的 PATH 設定為絕對路徑。(這點我卡最久)

我原本的程式碼是:

driver = webdriver.Chrome(options=chrome_options)

但後來 ChatGPT 提醒我說,Cron 程式都需要絕對而非相對路徑,所以建議我修改成:

driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver',options=chrome_options)

這樣程式就可以正常運作了。但 log 有提醒我,這個 executable_path 的寫法已經被棄用,現在建議用 service 的方式:

# Create a Service object and pass it the path to the driver executable
service = Service('/usr/local/bin/chromedriver')

# Use the Service object when creating the WebDriver instance
driver = webdriver.Chrome(service=service, options=chrome_options)

題外話,網路上蠻多人都會說 Cron 很難知道到底哪裡出問題。所以建議可以在寫 cron 的時候,輸出 python script 的一些 log。像是上述的 service 就是透過這個方式找到。程式的寫法大概是這樣(full/path/to 要換成實際的路徑):

* * * * * /usr/bin/python3 /full/path/to/screenshot.py >> /full/path/to/cronjob.log 2>&1

然後可以用下述語法檢查 Cron 的系統紀錄:

grep CRON /var/log/syslog

終於解決終端的問題,可以繼續寫接下來的服務了。

ChatGPT 工程師到底可以走多遠呢?we’ll see.