현재 bash의 일부 기능을 사용하고 있습니다. 하지만 지금까지 나는 혼란스러워요. 먼저 제가 하고 싶은 일을 설명하겠습니다.
목표 출력:
2016-11-18T05:48:01 NFS="NFS1" MOUNT_STATUS=True RUN_TIME=0.1
따라서 이 대상 출력을 얻으려면 df -hP를 사용하여 모든 NFS 마운트 스토리지를 확인해야 합니다. 설치되어 있으면 TRUE로 표시되고, 그렇지 않으면 FALSE로 표시됩니다. 따라서 여기서 실제로 까다로운 부분은 스크립트가 설치 경로에 테스트 파일을 생성해야 한다는 것입니다.
예를 들어, df -hP를 실행하고(출력은 다음과 같음) /dev가 마운트되었는지 확인합니다(마운트되어 있는 경우). 스크립트는 /dev에 테스트 파일을 생성한 다음 테스트 파일을 삭제하고 시작 시간을 기록합니다. 파일 생성 및 파일 삭제까지의 종료 시간 (약 0.5ms)
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 8.5G 3.7G 4.9G 44% /
devtmpfs 902M 0 902M 0% /dev
tmpfs 913M 0 913M 0% /dev/shm
이것은 내 현재 스크립트입니다.
now="$(date +%Y-%m-%dT%H:%M:%S)"
sp=" "
NFS="NFS1 NFS2 NFS3"
MOUNT_STATUS="$TRUE FALSE" #TRUE or FALSE
RUN_TIME="" #Start time to endtime of script per NFS
if [ $# -eq 0 ]; then
echo $now
set -e
else
for i in "$@"; do
echo -n "$now" ;
echo -n NFS=$(df -hP "$i" | awk '{print $NF}' | sed -n '1!p') 2>&1 | sed 's/^/ /' ;
echo $(if [[ "$i" == "/media /a/nbackup201 /a/ndt301" ]] ;
echo -n MOUNT_STATUS=;
then
echo 'TRUE' ;
else
echo $([[ "$i" != "/media /a/nbackup201 /a/ndt301" ]]) ;
echo 'FALSE' ; fi) | sed 's/^/ /'
done
fi
현재로서는 스크립트에 여전히 몇 가지 부분이 누락되어 있지만 내 질문 중 하나는 다음과 같습니다.
[root@strg ~]# sh script.sh /dev /run /boot a
2016-11-21T08:50:51 NFS=/dev MOUNT_STATUS=TRUE
2016-11-21T08:50:51 NFS=/run MOUNT_STATUS=TRUE
2016-11-21T08:50:51 NFS=/boot MOUNT_STATUS=TRUE
2016-11-21T08:50:51df: ‘a’: No such file or directory
NFS= MOUNT_STATUS=TRUE
[root@strg ~]#
따라서 스크립트를 실행하고 잘못된 마운트 지점을 입력했는데 여전히 "NFS=MOUNT_STATUS=TRUE"라고 표시되면 NFS=a STATUS=FALSE라고 표시되어야 하기 때문에 루프에 무엇이 문제인지 혼란스럽습니다. ?
그리고 너무 친절하시다면 파일 생성/삭제를 삽입하고 시간을 기록할 수 있는 위치를 알려주실 수 있을까요? 파일을 생성하는 가장 좋은 옵션/명령은 무엇입니까? 너무 혼란스러우면 알려주시기 바랍니다. 나는 그것을 더 잘 설명하려고 노력할 것입니다.
답변1
문제는 스크립트가 각 매개변수를 반복하고 매개변수가 올바른 마운트 지점인지 여부에 관계없이 모든 명령을 실행한다는 것입니다. 테스트하지는 않았지만 아래 솔루션을 사용하면 원하는 결과를 얻을 수 있습니다.
now="$(date +%Y-%m-%dT%H:%M:%S)"
sp=" "
NFS="NFS1 NFS2 NFS3"
MOUNT_STATUS="$TRUE FALSE" #TRUE or FALSE
RUN_TIME="" #Start time to endtime of script per NFS
if [ $# -eq 0 ]; then
echo $now
set -e
else
for i in "$@"; do
echo -n "$now" ;
if [ -d $i ]; then
echo -n NFS=$(df -hP "$i" | awk '{print $NF}' | sed -n '1!p') 2>&1 | sed 's/^/ /' ;
echo $(if [[ "$i" == "/media /a/nbackup201 /a/ndt301" ]] ;
echo -n MOUNT_STATUS=;
then
echo 'TRUE' ;
else
echo $([[ "$i" != "/media /a/nbackup201 /a/ndt301" ]]) ;
echo 'FALSE' ; fi) | sed 's/^/ /'
else
echo -n NFS=$i MOUNT_STATUS=false
done
fi