crontab(ln -sf)を介してシンボリックリンクを定期的に更新する方法

crontab(ln -sf)を介してシンボリックリンクを定期的に更新する方法

背景

使用する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/

スケジュールされたジョブの使用

その後、毎月1日にこのシンボリックリンクを自動的に更新しようとするため、常に現在の日付のディレクトリにリダイレクトされます。
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とにかく生成されません)。

私が何を間違っているのかわかりません。それとも単に違法な用途lnで使用しているのでしょうか?crontab

編集:最も疑わしい部分、つまり式にln日付関数を使用する部分を作成していないことがわかりました。

答え1

パーセント記号は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、またはBSDを持つすべてのシステムでln(または)使用することです。-nこれにより、新しいリンクが作成されるまでリンクが指すディレクトリに移動しなくなります。--no-dereferenceln-hln

移植可能な解決策は、まず以下を使用して明示的にリンクを削除することですrm

ln -s some_directory link

後:

rm link && ln -s some_directory link

答え2

crontab ln私のスケジュールを失敗させたエラーをこの答えに要約したいと思います。
Kusalanandaの回答ありがとうございます。記録のためにまとめました。

まず、Kusalalanandaが述べたように、ディレクトリへのシンボリックリンクを更新しようとすると、ディレクトリ内にシンボリックリンクが生成されるため、フラグを設定する必要があるため、-nアルゴリズムlnは参照に従いません。

いいね:

ln -nsf  /NAS-mein/data/$(date "+%Y%m")  PNG_path

動作しない:

ln -nsf  /NAS-mein/data/$(date "+%Y%m")  PNG_path


第二に、Kusalalanandaが述べたように、cronは%cronで特別な意味を持つので、エスケープする必要があります。

いいね:

0 0 1 * *  /bin/ln -nsf  /NAS-mein/data/$(date "+\%Y\%m")  PNG_path

動作しない:

0 0 1 * *  /bin/ln -nsf  /NAS-mein/data/$(date "+%Y%m")  PNG_path


cron3番目と最後の項目は、実際にはorとは実際には関係ありませんが、に追加されたものと同じターゲットに書き込むことはできませんln。逆に、それは正しいです。 (実際にforフラグがなければ何も出力されませんが、少なくとも空のログが生成されたことがわかります。)stderrstdout2>>&12>&1-vln

いいね:

0 0 1 * *  /bin/ln -nsf  /NAS-mein/data/$(date "+\%Y\%m")  PNG_path  >>.log  2>&1

動作しない:

0 0 1 * *  /bin/ln -nsf  /NAS-mein/data/$(date "+\%Y\%m")  PNG_path  >>.log  2>>&1

関連情報