cron 任務是在什麼情境中執行的?

cron 任務是在什麼情境中執行的?

我在摧毀了一個 Linux 機器後問了這個問題。讓我給你一些背景知識,這樣你就知道我來自哪裡。

我目前有(嗯……確實有)一個運行 Apache 的 RedHat Linux 機器,並添加了 Phusion Passenger 以在 Apache 下運行 Ruby 應用程式。該應用程式充當一項服務,定期向辛辛那提地區的資訊亭提供快取檔案。這個網路應用程式運作良好,唯一剩下的部分是設定一個 cron 任務來檢索需要快取的所有資訊並將其打包到幾個不同的更新包中以服務資訊亭。為了實現這一目標,我編寫了一個 Ruby 腳本來處理資料的獲取和打包。為了設定 cron 任務,我只使用了內建的 crontab。腳本看起來像這樣:

#!/bin/bash

cd ../lib
ruby pdf_cache.rb
ruby pdf_prepare.rb
ruby rss_cache.rb
ruby nightly-pack.rb 
cd ..
chown -R www.www *

該腳本位於 cron 資料夾中,目錄結構如下所示:

.
|-- cron
|-- feeds
|-- lib
|   `-- trash
|-- logs
|-- nightly-packs
|-- pdf
|   `-- tank
|-- public
`-- tmp

我運行了crontab -e以下root內容:

0 3 * * * /usr/local/apache2/ruby_projects/kiosk/cron/schedule_job

它應該每天凌晨 3 點執行該腳本。在安排這個 cron 任務的第二天,我得到了一個非常不幸的驚喜。 cron 任務是在 root 中執行的,我認為大多數命令都失敗了,除了將chmod -R www.www *系統中所有內容的所有權更改給使用者之外www

我的問題是;實現 cron 任務的正確方法是什麼?我現在意識到我可能不應該在該root帳戶下運行它,並且我不確定如何在該www帳戶下運行它,因為該用戶沒有 shell,並且您無法成功su存取該www用戶。

答案1

我打賭你可以只給使用者一個 shell,只是限制遠端存取它的能力及其權限。

Cron 任務在創建 Cron 任務的用戶下運行,因此這就是它以root.

答案2

另一個建議:加入-e像這樣的腳本的 shebang 行(即#!/bin/bash -e)。如果腳本中的任何命令失敗,這將使腳本退出。它不能保證你不會有任何不愉快的意外,但它可以防止腳本運行完全脫離軌道(可以這麼說),並防止多種連鎖反應失敗。

答案3

執行此操作的正確方法是“su - ”,將您的 cronjob 設定為該使用者。然後它將以此用戶身份運行。或者,根據您使用的 cron 守護程序,它可能有第六個欄位來定義使用者。

希望這可以幫助。還有其他技巧,但讓它正常工作總是對您有最好的幫助。

相關內容