背景
使用する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-dereference
ln
-h
ln
移植可能な解決策は、まず以下を使用して明示的にリンクを削除することです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
cron
3番目と最後の項目は、実際にはorとは実際には関係ありませんが、に追加されたものと同じターゲットに書き込むことはできませんln
。逆に、それは正しいです。 (実際にforフラグがなければ何も出力されませんが、少なくとも空のログが生成されたことがわかります。)stderr
stdout
2>>&1
2>&1
-v
ln
いいね:
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