'flock'이 데스크탑 PC에서는 무작위로 실패하지만 노트북에서는 실패합니다. 하드웨어 결함일 수 있습니까?

'flock'이 데스크탑 PC에서는 무작위로 실패하지만 노트북에서는 실패합니다. 하드웨어 결함일 수 있습니까?

아래 스크립트를 사용하여 flock.

내 노트북에서는 항상 잘 작동합니다.
하지만 데스크탑 PC에서 실행하면 무작위로 실패하여 두 인스턴스가 동시에 실행될 수 있습니다(동일한 잠금 획득!).
둘 다 우분투 20.04를 실행합니다.

그렇다면 내 데스크탑에 하드웨어 문제가 있는 것으로 의심됩니다. RAM이 문제일까요?

그래서 내 질문은 잘못된 행동으로 인해 나에게 제공되는 팁을 기반으로 결함이 있는 하드웨어 부분을 어떻게 추적/확인할 수 있습니까?
내 말은, 어떤 하드웨어에 결함이 있는지(또는 품질이 낮을 수 있는지) 지적할 수 있는 무리는 무엇입니까?

문제를 확인하는 방법:
전체 경로 스크립트 이름과 일치하는 하위 명령이 있는 모든 무리 프로세스를 얻습니다(즉, 무리가 하위 명령으로 실행해야 하는 것입니다).
또한 각 스크립트가 수행한 작업을 기록하며 해당 로그에는 두 개 이상의 인스턴스에 대한 동시 작업이 있습니다. 잠금이 획득된 경우에만 작업이 기록됩니다.
배타적/고유 잠금을 제공하기 위해 무리를 올바르게 구성할 수 없습니까?
나는 지금 다른 터미널에서도 이것을 사용하고 있습니다.
while true;do date;lslocks |grep flock;sleep 1;done

스크립트: cat >flock.tst.sh;chmod +x flock.tst.sh

#!/bin/bash

LC_NUMERIC=en_US.UTF-8

# HELPERS:
#trash /tmp/flock.tst.log;for((i=0;i<20;i++));do flock.tst.sh&:;done #run this on shell
#pkill -fe flock.tst.sh #end all concurrent children trying to acquire the lock
#while true;do date;lslocks |grep flock;sleep 1;done #use this to check if there is more than one lock acquired, check also the log file to confirm it, and if there is two subsequent WORK on the terminal log, it means a problem happened too

: ${bDaemonizing:=false}
: ${bReport:=false} #help use this to show more log, but will be harder to read it.
: ${bCheck:=false} #help this will let the script check if there is more than one instance working, but it may be slow and make it more difficult to let the problem happen
if ! $bDaemonizing;then
  echo "this IS a daemon script, only one instace runnable"
  flSelf="`realpath $0`"
  
  #set -x 
  while ! bDaemonizing=true flock --timeout=$(bc <<< "0.2+0.0$RANDOM") "$flSelf" "$flSelf" "$@";do
    if $bCheck;then
      strParents="$(nice -n 19 pgrep -f "^flock --timeout=.* $flSelf $flSelf" |tr '\n' ',' |sed -r 's"(.*),"\1"')"
      if [[ -n "$strParents" ]];then
        anDaemonPid=( $(nice -n 19 pgrep --parent "$strParents" -f "$flSelf") )
        if((${#anDaemonPid[*]}>1));then echo "ERROR: more than one daemon, flock failed!? :(";ps --no-headers -o ppid,pid,cmd -p "${anDaemonPid[@]}";fi
        if $bReport && ((${#anDaemonPid[*]}==1));then echo "$$:Wait daemon stop running or 'kill ${anDaemonPid[0]}'";fi #could be: "already running, exiting.", but the new instance may have updated parameters that work as intended now.
      fi
    fi
  done
  
  exit #returns w/e flock does
fi

echo "$$:Work:`date`"
for((i=0;i<60;i++));do
  echo "`\
    echo $i;\
    date;\
    ps --no-headers -o ppid,pid,stat,state,pcpu,rss,cmd -p "$PPID";\
    ps --no-headers -o ppid,pid,stat,state,pcpu,rss,cmd -p "$$";\
  `" >>/tmp/flock.tst.log
  
  sleep 1
done
echo "$$:Done:`date`"


일부 결과:
보시다시피, 독점 잠금은 프로세스 1458428(flock:1458427) 및 1438949(flock:1438941)에 의해 동시에 획득되었습니다.

스크립트에 의해 생성된 로그 파일은 이 문제를 보여줍니다(초 50에 잠금을 획득하지 말아야 할 다른 인스턴스의 두 번째 로그가 발생했습니다).

2
Fri 22 Jan 17:03:16 -03 2021
1438953 1458427 S    S  0.0   784 flock --timeout=.22377 /home/myUser/bin/flock.tst.sh /home/myUser/bin/flock.tst.sh
1458427 1458428 S    S  0.0  3852 /bin/bash /home/myUser/bin/flock.tst.sh
50
Fri 22 Jan 17:03:16 -03 2021
1438925 1438941 S    S  0.0   788 flock --timeout=.229687 /home/myUser/bin/flock.tst.sh /home/myUser/bin/flock.tst.sh
1438941 1438949 S    S  0.0  3900 /bin/bash /home/myUser/bin/flock.tst.sh

lslock다음을 보여줍니다(while with는 date팁으로 스크립트에 있음).

Fri 22 Jan 17:03:16 -03 2021
flock           1459088 FLOCK  1.8K WRITE* 0          0          0 /home/myUser/bin/flock.tst.sh
flock           1458427 FLOCK  1.8K WRITE  0          0          0 /home/myUser/bin/flock.tst.sh
flock           1438941 FLOCK  1.8K WRITE  0          0          0 /home/myUser/bin/flock.tst.sh (deleted)
Fri 22 Jan 17:03:17 -03 2021
flock           1459616 FLOCK  1.8K WRITE* 0          0          0 /home/myUser/bin/flock.tst.sh
flock           1458427 FLOCK  1.8K WRITE  0          0          0 /home/myUser/bin/flock.tst.sh
flock           1438941 FLOCK  1.8K WRITE  0          0          0 /home/myUser/bin/flock.tst.sh (deleted)

많은 동시 인스턴스를 생성한 터미널 로그에 다음이 표시됩니다.

1438949:Work:Fri 22 Jan 17:02:23 -03 2021
1458428:Work:Fri 22 Jan 17:03:14 -03 2021
1438949:Done:Fri 22 Jan 17:03:26 -03 2021
1476209:Work:Fri 22 Jan 17:04:02 -03 2021
1458428:Done:Fri 22 Jan 17:04:17 -03 2021

답변1

가설: 그 일이 일어나기 직전에 스크립트를 저장했습니다. 편집자가 복사본을 저장한 다음 해당 복사본을 원래 경로로 이동했습니다. 보다Vim이 이걸 어떻게 하는지그리고.

실제로 이전 잠금은 이전 파일(inode)에 여전히 유지되었습니다. 이는 …/flock.tst.sh (deleted)의 출력 과 같이 표시됩니다 lslocks. 그러나 flock귀하의 스크립트(다른 인스턴스?)는 경로를 사용하여 계속 생성되었습니다. 경로가 다른 inode를 가리키기 시작하면 일부 새로운 flockinode가 새 잠금을 획득하도록 허용되었습니다. 이는 …/flock.tst.sh의 출력 과 같이 표시됩니다 lslocks.

두 개의 자물쇠는 독립적이어서 서로를 차단할 수 없었습니다.다른파일. 무리는 설계된 대로 작동했습니다.

실제로 두 개의 스크립트 인스턴스를 실행하여(그래서 하나는 잠금을 얻고 다른 하나는 계속 잠금을 시도함) 를 사용하여 열고 즉시 vim( )를 작성하여 결과를 다시 생성할 수 있습니다. :w또는:

cp flock.tst.sh foo
mv foo flock.tst.sh

관련 정보