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의 답변에 감사드립니다. 기록을 위해 정리했습니다.

첫째, Kusalananda가 언급했듯이 디렉토리에 대한 심볼릭 링크를 업데이트하려고 하면 디렉토리 내에 심볼릭 링크가 생성되므로 -n플래그를 설정해야 하므로 ln알고리즘이 참조를 따르지 않습니다.

좋아요:

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

작동 안함:

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


둘째, Kusalananda가 언급했듯이 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세 번째이자 마지막 항목은 실제로 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

관련 정보