Cron

如何通過 crontab 定期更新符號連結 (ln -sf)

  • February 1, 2019

背景

我要使用的PNG圖像文件根據日期儲存在目錄中,例如:

/NAS-mein/data/201812/

PNG儲存在其中/NAS-mein/data/201812/foo/bar/20181231_1500.png

所以我PNG_path在我的主目錄中創建了一個符號連結

ln -s /NAS-mein/data/201812/ PNG_path

我可以通過以下方式手動更新它:

ln -sf /NAS-mein/data/201812/ PNG_path

工作正常並返回``PNG_path’ -> /NAS-mein/data/201812'

我在 CentOS 6.7 環境中,我沒有超級使用者權限。

目標目錄由其他人創建,但授予 777 權限,即:

drwxrwxrwx /NAS-mein/

drwxrwxrwx /NAS-mein/data/

drwxrwxrwx /NAS-mein/data/201812/

使用 crontab

然後我嘗試在每月的第一天自動更新這個符號連結,所以它總是會將我重定向到目前日期的目錄。

我嘗試在 crontab 中開始一項工作,例如:

0 0 1 * * ln -sf /NAS-mein/data/$(date "+%Y%m") /home/me/PNG_path >>/home/me/.pngln.log 2>>&1

但這不起作用,即使沒有向日誌提供任何資訊。

所以我嘗試了:

0 0 1 * * cd /home/me/ && ln -sf /NAS-mein/data/$(date "+%Y%m") PNG_path >>.pngln.log 2>>&1

並將其包裝成一個 Bash 腳本,例如:

#!/bin/bash  
/bin/unlink  "/home/me/PNG_path"  
/bin/ln -sf /NAS-mein/data/$(date "+%Y%m")  PNG_path >>/home/me/.pngln.log  2>>&1  

但以上所有似乎都不起作用,因為符號連結沒有改變,也沒有記錄任何資訊(即.pngln.log無論如何都沒有創建。)

我不確定我在哪裡做錯了,或者使用lnincrontab不是合法用途?

編輯:我注意到我沒有寫出最可疑的部分:在ln表達式中使用日期函式。

百分號在 crontab 中很特殊,如果您將date命令放在那裡,則需要對其進行轉義(請參閱 參考資料man 5 crontab)。

您的符號連結指向一個目錄。當您ln再次執行時,它會將連結放在該目錄中。

例子:

$ mkdir real
$ ln -sf real link
$ tree
.
|-- link -> real
`-- real

1 directory, 1 file
$ ln -sf real link
$ tree
.
|-- link -> real
`-- real
   `-- real -> real

1 directory, 2 files

解決方案是在 Linux 或任何帶有 GNU coreutils’ 的系統上使用lnwith -n(或) ,並在 BSD 上使用 with。這將導致在創建新連結之前不會進入連結指向的目錄。--no-dereference``ln``-h``ln

一個可移植的解決方案是首先使用以下方式顯式刪除連結rm

ln -s some_directory link

之後:

rm link && ln -s some_directory link

引用自:https://unix.stackexchange.com/questions/497869