/ dev / null에 대한 하드 링크로 파일 교체


32

log.txt에 쓰는 응용 프로그램을 실행 중입니다. 앱이 새 버전으로 업데이트되어 지원되는 플러그인이 더 이상 호환되지 않습니다. log.txt에 엄청난 양의 오류가 발생하고 다른 로그 파일에 쓰는 것을 지원하지 않는 것 같습니다.

다른 로그에 어떻게 쓸 수 있습니까?

log.txt를 하드 링크 (응용 프로그램에서 차이점을 알 수 없습니까?) 또는 / dev / null을 가리키는 하드 링크로 바꾸는 것을 고려했습니다. 내 옵션은 무엇입니까?


당신은 할 수 없습니다 chmod -w log.txt?
user168715

답변:


30
# cp -a /dev/null log.txt

이것은 당신의 널 장치를 올바른 메이저 및 마이너 dev 번호로 복사하여 log.txt다른 것을 갖습니다 null.

커널에서 장치는 이름으로 알려진 것이 아니라 주요 숫자와 부 숫자로 알려져 있습니다. 나는 당신이 어떤 OS를 가지고 있는지 알지 못하기 때문에 우리가 이미 알고있는 곳에서 숫자를 복사하는 것이 편리하다는 것을 알았습니다. 주 번호와 부 번호를 잘못 사용하면 다른 장치, 아마도 디스크 나 쓰고 싶지 않은 다른 장치를 만들었을 것입니다.


4
이 명령이 필요 sudo하거나 루트 사용자로 실행 한다는 점은 주목할 가치가 있습니다. "올바른 메이저 및 마이너 개발자 번호"의 의미를 (답으로) 설명하십시오.
mklement0

3
(OP가 아닙니다.) 업데이트에 감사하지만, "주요 및 부수"가 /dev/null명령에서 사용되는 "경로"와 파일 경로가 어떻게 관련되는지에 대해서는 여전히 혼란스러워 합니다. 그리고, 나는 참고로 미래의 리더 도움이 될 생각 당신의 대답에sudo 필요합니다.
mklement0

1
@ wallyk : 감사합니다. 그러나 나의 요점은 : cp -a /dev/null log.txt내 의견 과 관련하여 어떻게 작용 하는가?
mklement0

1
@MALON은 : 사실 당신했고, 우분투 14.04에 당신이 필요가 sudo당신이 사용자로 실행하는 일이없는 한,이 명령을 수행하기 위해 root(일반적으로 낙심하는). 사용 sudo(또는 실행 root파일이있는 위치에 배치해야하는 경우) (V.Michel의 대답 @) 하드 링크 (이 답변) 또는 심볼릭 링크를 만드는 것은 모든 오른쪽 해결책이 될 수 있음을 모든 사용자 계정에 기록 할 수 있습니다, 그러나 요점은 다음과 같습니다. 요구 사항을 명시 적으로 유의하십시오.
mklement0

1
추신 : 나는 주요한 사소한 의견이 아마도의 사용을 권장하는 질문에 대한 의견 과 관련이 있음을 알고 있습니다 mknod. 의견은 일반적으로 거의주의를 기울이지 않으므로 누군가 만 질문을 읽은 다음 귀하의 답변이 혼란 스러울 수 있습니다.
mklement0

65

/ dev / null에 대한 심볼릭 링크를 만들 수 있으며 루트 일 필요는 없습니다.

ln -s /dev/null log.txt

이것은 또한 자체 문서화라는 장점이 있는데, ls -l log.txt예를 들어 "1, 3"이 어떻게 든 중요하다는 것을 아는 것보다는 / dev / null에 대한 심볼릭 링크 라는 것을 보여줍니다.
Monty Harder

14

다른 대답은 아마도 효과가있을 것입니다. 특히 symlink 솔루션이 가장 쉬운 솔루션 일 것입니다. 나는 주로 완전성을 위해 이것을 제공합니다.

파일을 포함하는 파일 시스템이 장치를 지원하지 않는 경우 mknod(또는 cp -anodev를 들어 옵션 으로 마운트 된 경우) 관련된 솔루션 (또는 )이 문제가됩니다 . 물론 파일 시스템 간의 하드 링크는 작동하지 않습니다.

하드 링크 또는 새 장치 노드 작성에 대한 대안은 파일 시스템 트리의 한 부분에서 다른 부분으로 파일 또는 디렉토리를 마운트 할 수있는 바인드 마운트를 사용하는 것입니다. 예를 들어 다음을 실행할 수 있습니다.

mount -o bind /dev/null /path/to/log.txt

이것은 하드 링크처럼 작동하지만 다음과 같습니다.

  • 파일 시스템에서 작동 할 수 있습니다 (하드 링크와 같은 파일 시스템 inode를 기반으로하지 않기 때문에)
  • 실제로 파일 시스템을 수정하지 않기 때문에 읽기 전용 파일 시스템에서 작동합니다.

완전한 예를 들면 다음과 같습니다.

bash-4.3# ls -l /var/log/boot.log
-rw-r--r--. 1 root root 7436 Dec 19 10:00 /var/log/boot.log
bash-4.3# mount -o bind /dev/null /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log
bash-4.3# echo words words words > /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log

그러나 바인드 마운트가있는 시스템에서만 작동합니다. (현대 리눅스와 동일)
reinierpost

어쨌든 로그 파일은 읽기 전용 파일 시스템에 속하지 않습니다.
Monty Harder

1
읽기 전용 파일 시스템에서 단일 파일에 쓰려고하는 빈도에 놀랄 것입니다. 그리고 nodev파일 시스템 에 잘있을 수 있습니다 .
Larsks

6

응용 프로그램이 log.txt를 처리하는 방법에 크게 좌우됩니다.

응용 프로그램이 기존 파일을 열고 파일에 쓰는 경우 다른 답변에 설명 된 것처럼 / dev / null로 심볼릭 링크하고 다른 곳에서는 심볼릭 링크하고 다른 곳에서는 하드 링크 할 수 있습니다 (하드 링크는 파일 시스템을 교차 할 수 없으므로 ' 이 점에서 많은 부분) / dev / null 장치 노드의 복사본을 만듭니다.

응용 프로그램이 log.txt를 삭제하고 다시 만들면 OTOH가 작동하지 않습니다. 전체 디렉토리를 다른 곳에서 심볼릭 링크하여 쓰기를 다른 파일 시스템으로 리디렉션 할 수는 있지만 디렉토리에있는 다른 것들을 처리해야합니다.

log.txt라는 파일을 만들려는 시도를 버리는 동안 대부분의 작업을 통과하는 사용자 정의 오버레이 파일 시스템을 만들 수 있기를 정말로 원한다고 생각합니다.


chattr +i log.txt처음으로 응용 프로그램은 더 이상 파일을 삭제하지 않습니다.
마르코 마르 살라

3

명명 된 파이프를 사용하는 하나의 부적절한 방법 :

# create a named pipe
mkfifo /path/to/log.txt
# read contents from the pipe and redirect them to /dev/null
cat /path/to/log.txt > /dev/null

filter 또는 nc over send와 같이 덤프 된 로그로 무엇이든 할 수 있습니다 .


경우 cat프로세스가 사망하거나 충돌하는 파이프가 가득 찼을 때, 로그인 프로그램이 중단됩니다.
마르코 마르 살라

-1

파일을 실제 널 장치로 만드는 것을 고려하십시오. 올바른 파일 형식과 동일한 부 및 주 번호로 mknod로 만든 "log.txt"파일은 널 장치로 작동합니다.


이것은 다른 사람들이 이미 말한 것에 아무 것도 추가하지 않습니다.
Kusalananda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.