2013-04-03 2 views
1

Я пытаюсь написать сценарий оболочки, который позволяет мне подключиться к удаленному компьютеру, чтобы узнать, какие пользователи запускают процесс vtwm более 14 дней. Вот что я написал до сих пор.grep в Shell Script

Есть две проблемы

  1. там может быть больше, чем один пользователь с этим активным процессом. Как сохранить все из них в переменной?

  2. Как определить, какой из вас был зарегистрирован более 14 дней?

Следующий код был написан с допущением, что существует только один пользователь с активным процессом vtwm. Но это не работает, потому что команда grep не распознает переменную $ u. , поэтому я никогда не могу получить дату, на которую пользователь вошел. Я не могу заставить mth1 и day1 работать из-за проблем с grep.

u=$(ssh host "w | grep vtwm | cut -d' ' -f1") 
echo "USER:"$u 
if [ -n "$u" ] then   
mth1=$(who | grep -i $u | cut -d' ' -f10 | cut -d'-' -f2) 
mth2=$(date +"%m") 
day1=$(who | grep -i $u | cut -d' ' -f10 | cut -d"-" -f2) 
day2=$(date +"%d") 
if [ $mth1==$mth2 ] then 
#do something 
elif[ $mth1!=$mth2 ] then 
#do something 
fi 
fi 
+0

Код ошибки. Переменная '$ u' выводится ssh'ing на другую машину, но' $ mth1' и '$ day1' основаны на локальных вызовах' who'? – danfuzz

+0

Включите функцию декомпозиции оболочки с помощью 'set -vx'. Вам будет намного легче увидеть, где и почему ваш код начинает сбой. Извините, что это слишком много кода для того, что вы заявили о цели. Посмотрите на использование 'awk' в качестве фильтра, чтобы уменьшить количество вызовов до' who' до 1X. Удачи. – shellter

ответ

2

Предположим, что вся эта среда Linux (вы не указали), приведенный ниже код может помочь вам.

  • Чтобы определить возраст этого процесса, я использовал ps -o etime, user, cmd
  • Скрипт получают 2 параметр, пределы дней и прока для поиска
  • микросотовые показывают весь процесс, независимо от того, если есть TTY назначить или не ...
    Если вам нужно ограничить процесс с помощью TTY, удалите x =>ps a -o ...
  • отредактируйте команду ssh в свою среду.

Пример, как называют этот сценарий: bash ./mytest.sh 5 bash, покажет BASh сессий с +5 дней.

# mytest.sh 
#--debug-only--# set -xv 

[ $# -ne 2 ] && echo "please inform : <#of_days> <regexp>" && exit 1 
# receive the # of days 
vLimit=$1 
# name of proc to search 
vProc=$2 

vTmp1=/tmp/tmp.myscript.$$ 

# With this trap , the temp file will be erased at any situation, when 
# the script finish sucessufully or interrupted (kill, ctrl-c, ...) 
trap "rm $vTmp1 2>/dev/null ; exit" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 

# ps manpage : 
# etime  ELAPSED elapsed time since the process was started, in the form [[DD-]hh:]mm:ss. 

ssh [email protected] "ps ax -o etime,user,command | grep -i '$vProc' " >$vTmp1 
while read etime user cmd 
do 

    # if not found the dash "-" on etime, ignore the process, start today... 
    ! echo "$etime" | grep -q -- "-" && continue 
    vDays=$(echo "$etime" | cut -f1 -d-) 
    [ -z "$vDays" ] && continue 
    if [ $vDays -ge $vLimit ]; then 
    echo "The user $user still running the proc $cmd on the last $vDays days...." 
    fi 
done < $vTmp1 

#--debug-only--# cat $vTmp1 
+0

очень приятно. Но почему бы не передать ssh в 'while read ...'. Удачи. – shellter

+0

Привет @shellter, да, он может использовать 'ssh ... | в то время как read', что позволит избежать обработки $ vTmp1. То, как я написал, на мой взгляд, легко понять, как работает, настраивать код и затем удалять то, что не нужно. Стереть всегда легко .. – ceinmart

Смежные вопросы