을 실행하면 w
사용자가 vi에서 특정 파일을 편집하고 있는 것을 볼 수 있습니다.
그러나 다른 디렉토리에 같은 이름을 가진 여러 파일이 있습니다.
이 파일 중 사용자가 편집 중인 파일이 무엇인지 어떻게 알 수 있나요?
답변1
다음과 같이 lsof
사용자를 선택하고 프로세스를 검색 할 수 있습니다 .vim
sudo lsof -u user -a -c vim | grep swp
@Fox가 지적했듯이 고전적인 접근 방식은 vi
임시 파일을 생성하므로 /var/tmp
이를 보려면 선택(테스트하지 않음)해야 합니다.
sudo lsof -u user -a -c vi | grep '/var/tmp/'
그러나 @Fox가 지적했듯이 클래식 파일과 실제 파일을 연관시킬 수 없으며 vi
답변에서 다음에 논의할 도구가 필요합니다(클래식의 vi
경우 vim
그것으로 충분합니다 lsof
).대개vim
오늘날 Linux에서는 vi
.
바라보다15 Linux lsof 명령 예(열린 파일 식별)
vim
예제 로 돌아가면 사용 중인 스왑 파일이 file
아래와 같이 열리는 것을 볼 수 있습니다..file.swp
사용자가 user1
다음을 수행하는 경우 vi file
:
$ sudo lsof -c vi -a -u user1 | grep swp
vi 3615 user1 3u REG 8,1 12288 265061 /home/user1/.file.swp
~에서man lsof
-a는 목록 선택 옵션을 AND로 연결합니다.
-cc 이 옵션은 c 문자로 시작하는 명령을 실행하는 프로세스에 대한 파일 목록을 선택합니다. 여러 -c 옵션을 사용하여 여러 명령을 지정할 수 있습니다. AND 옵션 선택에 참여하기 전에 단일 OR 세트에 추가됩니다.
-us 이 옵션은 로그인 또는 사용자 ID 번호가 쉼표로 구분된 그룹에 있는 사용자의 파일 목록을 선택합니다.
lsof
루트로 사용할 수 있는 이 외에도 sysdig
강력한 디버깅 프레임워크가 있습니다.
그러면 시스템에 열려 있는 모든 파일이 실시간으로 표시되며, 파일이 열리자마자 사용자, PID 및 프로세스가 나열됩니다.
sudo sysdig -p "%12user.name %6proc.pid %12proc.name %3fd.num %fd.typechar %fd.name" evt.type=open"
sysdig: 시스템 수준 탐색 및 문제 해결 도구
Sysdig는 Linux 커널에 설치하고 시스템 호출 및 기타 운영 체제 이벤트를 캡처하여 운영 체제 수준에서 실제 및 가상 머신을 감지합니다. 그런 다음 sysdig의 명령줄 인터페이스를 사용하여 이러한 이벤트를 필터링하고 디코딩하여 유용한 정보와 통계를 추출할 수 있습니다.
Sysdig를 사용하면 실시간 시스템을 실시간으로 검사하거나 나중에 분석할 수 있는 추적 파일을 생성할 수 있습니다.
snoopy
시스템 관리자를 위한 또 다른 유용한 도구로 프로세스에서 수행된 모든 호출을 syslog에 기록하는 이 도구를 설치할 수도 있습니다 . 사용자가 명령줄에서 호출하면 vi file
시스템 로그에 표시됩니다.
일단 설치되면 snoopy
제거할 때까지 execve()를 통해 모든 프로세스 호출을 기록한다는 점에 유의하십시오(이 작업이 항상 발생하기를 원할 수도 있고 원하지 않을 수도 있습니다).
snoopy: execve() 래퍼 및 로거
snoopy는 syslog(authpriv)에 대한 모든 호출을 기록하기 위해 libc에서 제공하는 execve() 함수 주변의 래퍼 역할을 하는 공유 라이브러리입니다. 시스템 관리자는 스누피가 경량/무거운 시스템 모니터링, 다른 관리자의 작업 추적, 시스템에서 무슨 일이 일어나고 있는지에 대한 좋은 "감각" 얻기(예: Apache 실행 cgi 스크립트)와 같은 작업에 유용할 수 있습니다.
설치하려면 다음을 수행 snoopy
하십시오 sysdig
.
$sudo apt-get install snoopy sysdig
관련 질문도 참조하세요:Linux 바이너리가 수행하는 작업 이해
답변2
이는 어떤 경우에는 효과가 있을 수 있습니다. ps
파일을 편집한 인스턴스의 프로세스 ID를 찾을 수 있습니다 .vi
$ w
...
username pts/2 :0.0 11:42 2:34m 0.28s 0.27s vim foo
$ ps aux | grep 'vim foo'
...
username 55899 .... vim foo
그런 다음 루트로서 해당 pid와 연관된 열린 파일 설명자를 확인합니다.
# ls -l /proc/55899/fd
...
lrwx------ 1 username group 64 Feb 8 14:23 6 -> /path/to/.foo.swp
이를 고려하면 해당 파일이 /path/to/foo
.
답변3
다음을 사용해야 합니다 lsof
.
$ lsof |grep -i vim
답변4
사용자가 실행한 명령을 알고 있다고 가정하지만, 사용자가 해당 명령을 실행한 디렉터리가 무엇인지 알고 싶습니다. 따라서 실행한 경우 해당 명령이 , 또는 또는 다른 것인지 vi myfile.txt
알 수 있습니다 ./home/user/myfile.txt
/tmp/myfile.txt
이 경우 루트로 실행한다고 가정하면 다음을 수행할 수 있습니다.
readlink /proc/<pid>/cwd
여기서 / <pid>
는 관심 있는 프로세스의 프로세스 ID입니다. 이는 해당 프로세스의 현재 디렉터리를 알려줍니다. 이는 원하는 디렉터리일 가능성이 가장 높습니다.vi
vim
하지만 참고하세요:
- 사용자는 편집기를 시작한 후 프로세스의 현재 디렉터리를 변경할 수 있습니다(예: 명령 사용
:cd
). 100% 신뢰할 수는 없지만 편집기를 생성한 쉘 프로세스의 현재 디렉토리를 확인할 수도 있습니다. - 사용자는 다른 파일을 열 수 있으며 이러한 파일은 명령줄에 표시되지 않으므로 완전히 다른 파일을 편집하고 있을 수 있습니다.