bash 스크립트가 디스크에서 계속 실행되는지 알 수 있는 방법이 있습니까?

bash 스크립트가 디스크에서 계속 실행되는지 알 수 있는 방법이 있습니까?

루프된 bash 스크립트가 메모리에 로드되는 것처럼 보일 때도 있지만 디스크에서 계속 읽는 것처럼 보이는 경우도 있습니다. 사소하지 않은 스크립트의 경우 이러한 일이 발생할지 알 수 없습니다.

일반적으로 이것은 실제로는 중요하지 않지만 스크립트를 변경하면 변경 사항을 저장할 때 실행 중인 스크립트가 손상되는 경우가 있습니다(항상 그런 것은 아니지만). 분명히 스크립트의 특정 지점에서 시작하기 때문입니다. 그리고 읽고 있는 내용은 더 이상 그들이 떠났을 때와 같지 않습니다!

그래서 저는 묻고 싶었습니다. 스크립트가 메모리에서 실행되지 않고 디스크에서 지속적으로 읽는지 알 수 있는 방법이 있습니까?

abc이와 같은 간단한 스크립트는 변경 및 xyz저장이 스크립트의 실행 중인 인스턴스에 영향을 주지 않기 때문에 완전히 메모리에서 읽고 실행되는 것처럼 보입니다 .

#!/usr/bin/env bash

while :
do
  echo abc
  sleep 2
done

어쩌면 그냥 크기 문제일까요?

답변1

이는 부분적으로 크기 문제입니다. 일반 파일에서 읽을 때 Bash는 C 라이브러리가 수행하는 것과 유사하게 한 번에 하나의 블록을 읽습니다(한 번에 수 킬로바이트일 수 있음). 그런 다음 얻은 모든 완전한 라인을 구문 분석하고 모든 작업을 수행합니다.충분히명령이 있습니다. 그러나 읽기 포인터도 중단된 위치로 반환하므로 파일이 작더라도 파일 수정 사항을 볼 수 있습니다. (항상 뒤를 돌아보는 것은 아닌 것 같습니다. 외부 명령을 실행할 때만 이렇게 하는지는 잘 모르겠습니다.)

그래서 당신이 이것을 가지고 있다면 :

echo one
sleep 123
# filler if needed
echo two

echo절전 모드 중에 해당 파일을 내부에서 편집하면 Bash가 해당 파일을 읽고 실행하기 전에 두 번째 파일을 수정할 수 있습니다 . 일부 다른 셸(예: Dash 또는 Busybox)은 읽기 포인터를 뒤돌아보지 않으므로 명령 사이에 수 킬로바이트 규모의 큰 패딩이 있는 경우에만 효과를 얻을 수 있습니다.

그러나 다음과 같은 경우

main() {
    echo one
    sleep 123
    # really long multi-kB comment
    # ...
    echo two
}
main

쉘은 함수를 한 번 읽고 저장한 다음 메모리에서 실행합니다.

"너"라는 관용어가 또 있어요

main "$@"; exit

파일의 마지막 줄로. Bash는 한 번에 전체 줄을 읽고 구문 분석하기 때문에 나중에 파일이 수정되더라도 쉘이 주 함수 후에 종료되도록 보장합니다.

이전에 아래에 다른 답변을 쓴 것 같습니다.런타임 대체 쉘 스크립트. 거기에는 자체 수정 스크립트의 예가 있습니다.

관련 정보