Linux за българи: Форуми

Linux секция за напреднали => Хардуерни и софтуерни проблеми => Темата е започната от: vstoykov в Jul 23, 2008, 21:52



Титла: как да получа времето на стартиране на процес
Публикувано от: vstoykov в Jul 23, 2008, 21:52
Използвам wput за качване на файлове. Написал съм скрипт, който да качва всички файлове от текущата директория и да повтаря качването, ако не е било успешно. Проблемът е, че понякога wput забива и не предава изпълнение на скрипта, който го е извикал докато не се прекрати (killall wput).

Идеята ми е, на всеки 5 минути да се пуска чрез crond една програма, която да проверява за забили процеси wput и да ги убива (за да може да се стартират отново). Но за целта ми трябва времето на стартиране на даден процес. Как мога да го получа?

Ето това е скрипта за сигурно качване:

wput_всички_обекти_от_ТЕКУЩАТА_директория_един_по_един.bash
Примерен код

#!/bin/bash

if [ "$1" = "" ]; then
echo "Къде ще се качват файловете?"
echo "ftp://име:парола@ftp.site.com/path/to/remotedir/"
read DestFTPURL
else
DestFTPURL="$1"
fi

ls | while read LN; do

while true; do
wput -nc -u --tries=-1 "$LN" "$DestFTPURL"
  if [ $? = 0 ]; then
   break
  fi
echo "Някаква грешка. Ще се направи още един опит след две секунди..."
sleep 2
done

done


Титла: как да получа времето на стартиране на процес
Публикувано от: Nikolavp в Jul 23, 2008, 22:49
Не разбрах какво искаш да постигнеш и кое точно време искаш. Ако е времето на стартиране на процеса, както си описал можеш да го вземеш с
Примерен код
ps u| grep wput | awk '{print $9}'



P.S. По интересно е защо wput забива  :D  :D





Титла: как да получа времето на стартиране на процес
Публикувано от: vstoykov в Jul 24, 2008, 07:15
Благодаря за кода. Това с awk е интересно - аз нямаше да се сетя да го направя така - щях да ползвам
Примерен код

 ps u | grep wput | crunch | cut -d " " -f 9

и една допълнителна програма crunch, която е взета от инсталатора на Slackware:
Примерен код

#!/bin/bash
read STRING
echo $STRING
                             


Да, по-интересно е да се разбере защо wput забива, но трябва да се чете доста изходен код :crazy:

По-лесно става като се стартира отново ;)

Обикновено се наблюдава когато качвам файл на някой безплатен хостинг и връзката се наруши поради някаква причина (струва ми се, че е при точно определена грешка, но не мога да го докажа).

Ползвам версия 0.6, която не е последната.





Титла: как да получа времето на стартиране на процес
Публикувано от: vstoykov в Jul 24, 2008, 07:29
Трябва да се добави и
Примерен код

grep -v grep


за да не се получи взимане на времето на grep:

Примерен код

valentin@darkstar:~$ ps u | grep wput
valentin  6915  0.0  0.1   3044   808 pts/1    S+   07:27   0:00 grep wput
valentin@darkstar:~$  


Получава се:

Примерен код

ps u | grep -v grep | grep wput | awk '{print $9}'






Титла: как да получа времето на стартиране на процес
Публикувано от: gat3way в Jul 24, 2008, 11:01
Какво значи "забива" ?

Може ли да видя как ps показва един "забил" процес?

Също така дали можеш да пуснеш strace -f -p pida_na_zabilia_proces и да пейстнеш резултата?


Титла: как да получа времето на стартиране на процес
Публикувано от: vstoykov в Aug 04, 2008, 20:07
В случая под "забил" имам предвид да не извежда нищо на монитора и да не прекратява изпълнението си за неограничено дълго време.

Ще се опитам да издебна един такъв процес.


Титла: как да получа времето на стартиране на процес
Публикувано от: vstoykov в Aug 04, 2008, 20:45
Скрипта е готов - настрох crond да го пуска на всеки 5 минути:
Примерен код

#!/bin/bash

wput_pids=$(ps u | grep -v grep | grep wput | awk '{print $2}')

for k in $wput_pids; do

 if ps u | grep -v grep | grep wput | grep $k | awk '{print $11}' | grep ^wput > /dev/null 2>/dev/null; then
#   echo "Проверяваме $k..."
   start_time=$(ps u | grep -v grep | grep wput | grep $k | awk '{print $9}');
#   echo "Време на стартиране: $start_time"
   start_h=$(echo $start_time | cut -d ":" -f 1)
   start_m=$(echo $start_time | cut -d ":" -f 2)
     if [ "$start_m" == "" ]; then
#       echo "Грешка при определянето на минутите"
        kill $k
       else
#         echo "Минутите са $start_m"
#         echo "Часовете са $start_h"
         sum_time=$(( $start_h * 60 ))
#         echo "Часовете са $sum_time минути."
         sum_time=$(( $sum_time + $start_m ))
         current_h=$(date +%H)
         current_m=$(date +%M)
         current_sum_time=$(( $current_h * 60))
         current_sum_time=$(( $current_sum_time + $current_m ))
         razlika=$(( $current_sum_time - $sum_time ))
#         echo "Разликата от текущото време е $razlika минути."
          if [ "$razlika" -gt "5" ]; then
#           echo "Разликата е по-голяма от 5."
#           echo "kill $k"
           kill $k
          fi
     fi

 fi



Може би трябва да заменя "kill $k" с  "killall wput" - така няма да има риск някой друг процес със същия номер да бъде убит (съществува вероятност процесът да приключи изпълнение и някой друг да се стартира със същия номер?).





Титла: как да получа времето на стартиране на процес
Публикувано от: tarator в Aug 04, 2008, 22:09
vstoykov,

Честно казано решението не ми харесва. Какво ще стане ако решиш да използваш wput да копираш огромен файл някъде, забравяйки че имаш скрипт, който убива всички wputs които са работили повече от 5 минути?

Аз бих променил първоначалния скрипт да запазва pid-а на пуснатия wput някъде (a защо не и времето на пускане в нещо по-човешко като секундите от началото на епохата например?) и съответно cronjob-a да използва този pid за да реши дали и кога да убие процеса. Всъщност не бих използвал изобщо допълнителен cronjob, а бих пуснал wput в background и бих направил оригиналния скрипт да проверява от време на време дали wput e завършил.