2016-07-13 2 views
0

Я пытаюсь проверить, открыт ли какой-либо файл или нет. Я использую lsof для этого, и я использую оболочку bash. Я написал сценарий bash, чтобы проверить, открыт ли файл или нет. Но я столкнулся с какой-то странной проблемой. Когда я запускаю сценарий из командной строки, используя user a, я получаю ожидаемый результат. Но, когда я запускаю скрипт, используя user b, я получаю другой результат.Сценарий Bash возвращает разные результаты для разных пользователей

Мне нужно вызвать скрипт из Talend Studio как user b, поэтому я не могу переключиться на user a и выполнить сценарий. Сценарий имеет 777 разрешения для user b и user b также является владельцем скрипта. Ниже приведен сценарий. Пожалуйста помоги.

#! /bin/bash 
# declare STRING variable 

FILENAME=$1 
if [ "$FILENAME" == "" ]; then 
echo "No file found..exiting" 
exit 
fi 
#While loop to check if the file has been completely copied 
while true; do 
#$(lsof /mnt/disk1/$FILENAME | wc -l) 
SZ=$(/usr/sbin/lsof <Path to file>/$FILENAME | wc -l) 
if [ $SZ -gt 1 ]; then 
echo "File $FILENAME is being copied in the Landing Zone" 
sleep 10 
else 
echo "Copied $FILENAME................" 
break 
fi 
done 

Мне нужно добавить user b в sudoers ли?

+0

@Bohemian/@ fedorqui Пожалуйста, помогите выше – shashank

+1

Каков ожидаемый результат и какой результат вы получите как пользователь b? – chepner

+0

@chepner При запуске как «пользователь a», я вижу «файл, копируемый» в качестве вывода, пока файл не закончит копирование, а затем распечатает «Скопировано ». Когда я запускаю его как «пользовательский b», я получаю «Скопировано », даже если когда файл все еще скопирован – shashank

ответ

0

Цель, которую вы используете «lsof», - это просто проверить, открывается ли $ FILENAME или нет, не так ли? Итак, я думаю, что лучший способ - создать файл флага при открытии $ FILENAME, но не использовать «lsof» для проверки, потому что «lsof» - дорогостоящий способ сделать это. Например:

В вашей «зоны посадки»:

#!/bin/bash 

FILENAME=/foo/foo1 
if [ -f /tmp/filename.flag ] ; then 
    echo "the file is opened now ..." 
else 
    touch /tmp/filename.flag 
    cp -arf $FILENAME /tmp/. # or use rsync to copy it 
    echo "file copy is done ..." 
    rm -rf /tmp/filename.flag 
fi 

И, когда-то вы можете просто «потрогать /tmp/filename.flag», чтобы остановить эту задачу.