script 經 cron 執行異常但直接執行ok ? - Linux

Eden avatar
By Eden
at 2017-03-04T03:42

Table of Contents

script 功能:
可移除 qnap NAS 的 /share/tmp 中, mtime 超過 7 天的檔案。
利用 cron 定時執行。
(補充一下,相關工具如find之類全是以 ipkg 安裝之外部工具)

由於怕誤刪(rm -rf / 之類....),所以我另創帳號 sysbot_tmp_cleaner 來執行
刪除動作。/share/tmp也已經允許 sysbot_tmp_cleaner 讀寫,也實際 rmdir 過了。

設定 cron 後,的確有執行,但 find 卻找不到任何檔案。
而直接執行 script 則是可以找到檔案。

請問可能原因為何呢?

script 在最下方,或是:
http://pastebin.com/aPeNv2zp

script 透過 cron 執行後,輸出至 log 的內容為:
------------------------
Clear time: 2017-03-04 03:15:01
sysbot_tmp_cleaner
sysbot_tmp_cleaner
Format is: mtime(yyyy-mm-dd) \t size(KB) \t username \t filename \n , dir name end by '/'
Clear finish: 2017-03-04 03:15:01
-----------------------
而直接執行(以admin)則是在中間的 sysbot_tmp_cleaner 前充滿檔案路徑。



另外一個奇怪的問題。為何直接以 sysbot_tmp_cleaner 執行

find /share/tmp ......

找不到檔案,但加了/後就可以?

find /share/tmp/ ......

(update: 想起來了,/share/tmp 是 soft link , 直接以 ls /share/tmp 也只是顯示
連結本身,要 ls /share/tmp/ 。大概是這原因吧!)


--------- 以下 script --------------


#!/bin/sh
# This script clear too old files in tmp folder . Execute by cron.
# Run in every day 06:00
# echo '00 6 * * * /share/homes/admin/bin/clear_old_file.sh' > /etc/config/crontab

tmp_dir="/share/tmp/"
log_path="/share/system/log"
log="${log_path}/clear_nas_tmp.log"
lifetime_day=8
operator="sysbot_tmp_cleaner"

#------------------------------------

time_start=$(date "+%F %T")

# Add "/" at $tmp_dir end position, must be it or sysbot_tmp_cleaner can't get list.
tmp_dir=$(echo "$tmp_dir" |sed 's/\/*$//')"/"


# find and delete folders by operator
# Don't use rm , it will cause error "Argument list too long".
# dir first for fast remove.
# Info format is: mtime(yyyy-mm-dd) \t size(KB) \t username \t filename \n , dir name end by '/'
dirs_info=$(coreutils-su "$operator" -s "/bin/sh" -c "
findutils-find "$tmp_dir" ! -path "$tmp_dir" -type d -mtime +${lifetime_day} ! -user admin -printf '%TY-%Tm-%Td\t%k\t%u\t%p/\n' ;whoami")
# find and delete files by operator
files_info=$(coreutils-su "$operator" -s "/bin/sh" -c "
findutils-find "$tmp_dir" ! -path "$tmp_dir" -type f -mtime +${lifetime_day} ! -user admin -printf '%TY-%Tm-%Td\t%k\t%u\t%p\n' ;whoami")


num=$(( $(wc -l <<< "$dirs_info") + $(wc -l <<< "$files_info") ))

time_end=$(date "+%F %T")

if [ "$num" -gt "0" ] ; then
# record remove files
# check if log.gz exist then unzip
[ -f "${log}".gz ] && gzip -d "${log}".gz
echo "Clear time: $time_start" >> "${log}"
echo "$dirs_info" >> "${log}"
echo "$files_info" >> "${log}"
echo "Format is: mtime(yyyy-mm-dd) \t size(KB) \t username \t filename \n , dir name end by '/'" >> "${log}"
echo "Clear finish: $time_end" >> "${log}"
gzip "${log}"


# move too old log file when > 50 MB, you can change to use logrotate
log_size=$(du -ms "${log}".gz |cut -f 1 )
if [ "$log_size" -gt "50" ] ; then
mv "${log}".gz ${log_path}/clear_nas_tmp.old.log.gz
fi
fi

--
Tags: Linux

All Comments

Mason avatar
By Mason
at 2017-03-08T22:54
找找看/var/log/cron或/var/log/syslog之類的,應該有error
然後你為什麼不在cron裡面指定user,要用su做?
Carolina Franco avatar
By Carolina Franco
at 2017-03-13T00:47
findutils-find的雙引號讀起來怪怪的,$tmp_dir應該不用包?
(不過這大概不影響)
Brianna avatar
By Brianna
at 2017-03-13T14:52
find的那個問題資訊有點少,亂猜會不會是這樣:
Donna avatar
By Donna
at 2017-03-14T06:36
find /share/tmp ! -path /share/tmp
Isla avatar
By Isla
at 2017-03-17T18:26
NAS上的find跟一般的好像有點不同,我不會有最後的/
Steve avatar
By Steve
at 2017-03-19T09:14
喔喔,原來是因為reboot完會被清掉,而且沒有user設定
Margaret avatar
By Margaret
at 2017-03-21T06:04
有辦法保存嗎?我還沒測試關機後crontab能否保留 XD
Lucy avatar
By Lucy
at 2017-03-25T19:46
喔不是,我是說QNAP那:"Do NOT edit crontab the usual way!"
文件上寫說不能用一般的crontab編輯方式……
Rebecca avatar
By Rebecca
at 2017-03-26T17:52
看了那你個連結才注意到上面的設定比較特殊

sed 用法請教

Todd Johnson avatar
By Todd Johnson
at 2017-02-28T09:47
以下是centos7 /etc/init.d/network 裡的某幾行, 第二行應該是d command, 但d前面的address部分不知如何解釋? ------------------------------------------------------ sed -e and#34;$__sed_di ...

無法 hibernate

Ivy avatar
By Ivy
at 2017-02-27T13:19
ArchLinux ,確定有在 kernel 啟用 resume hook ,而且在 base 後面 udev 前面 在 grub 裡面也有設定 resume=UUID=andlt;UUIDandgt; (這裡當然有替換掉) 但是在開機時依舊顯示像這樣的訊息: ERROR: resume: hibernat ...

Gitlab server 架設問題求救

Elma avatar
By Elma
at 2017-02-25T18:03
想請問大家關於gitlab中無法發送mail的情況: 目前是安裝在Redhat的系統下,有根據鳥哥的教學來設定postfix (雖然不確定有沒有設定正確) 也有進gitlab的文件中將SMTP設定成gmail, 但設定完後建立新使用者時,會發現mail會卡在postfix的mail queue內, 顯示 ...

重灌之後,pcmanx ssh連線亂碼

Leila avatar
By Leila
at 2017-02-23T23:32
先灌 win10 再來是 linux mint 18.1 pcmanx 連線 bbsuatptt.cc:22 會亂碼 ptt.cc則不會 有人能幫忙嗎 google過,似乎改字體整個系統都改uki字體 于是乎就沒另裝字體 想根原本一樣 與telnet的字體相同就好 - ...

連不上raspbian的ssh

Olive avatar
By Olive
at 2017-02-23T18:53
因工作需求第一次操作linux系統 目前手頭有兩台樹莓派 在同一個網域下 一台可以用ssh連上,一台就沒辦法 這實在讓我不知道該如何解決 用ssh -v看出現以下訊息 OpenSSH_6.6.1, OpenSSL 1.0.1e-fips 11 Feb 2013 debug1: Reading configu ...