100자를 초과하는 파일 경로가 전달되면 crontab에서 "해당 파일 또는 디렉터리가 없습니다"라는 오류가 발생합니다.

100자를 초과하는 파일 경로가 전달되면 crontab에서 "해당 파일 또는 디렉터리가 없습니다"라는 오류가 발생합니다.
$ touch aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBBB
$ crontab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBBB
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: No such file or directory

이 동작은 이상해 보입니다(오류 메시지에서 경로가 어떻게 잘리는지 확인). 저는 데비안 불스아이 11을 사용하고 있습니다.

이것은 버그입니까, 아니면 crontab에 특별한 제한이 있는 특별한 이유가 있습니까?

여기 도커 이미지에서는 재현할 수 없습니다.https://hub.docker.com/r/willfarrell/crontab

답변1

Cygwin 버전은 crontab설명 오류 메시지를 인쇄합니다.

file=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcd
touch "$file"
crontab "$file"
crontab: usage error: filename too long

echo "$file" | awk '{print length}'
108

이 메시지는 귀하의 우려사항을 해결하지만 어떠한 설명도 제공하지 않습니다.

불행하게도 데비안 버전은 이를 잘 설명하지 못합니다:

crontab "$file"
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU: No such file or directory

echo 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU' | awk '{print length}'
99

그러나 소스 코드( apt-get source crontab)는 많은 단서를 제공합니다 cron.h.

#define  MAX_FNAME       100     /* max length of internally generated fn */

그런 다음 crontab.c:

static  char            Filename[MAX_FNAME];
(void) strncpy (Filename, argv[optind], (sizeof Filename)-1);
Filename[(sizeof Filename)-1] = '\0';

이러한 조각으로 알 수 없는 경우 파일 이름 길이가 99자로 하드코딩된 제한이 있습니다. 자의적인 이유 외에는 다른 이유가 없다고 생각합니다."그 정도면 충분히 길어야지". 올바른 접근 방식은 아마도 다음을 사용하는 것입니다.PATH_MAX+1, 그러나 저자는 이것을하지 않았습니다. ㅏ논평코드는 아마도 1988년에(또는 1994년에) 작성되었을 것입니다. 그러나 상수가 공식화된 것은 POSIX 이전이었을 가능성이 높습니다.

관련 정보