Автор Тема: как да получа времето на стартиране на процес  (Прочетена 1922 пъти)

vstoykov

  • Напреднали
  • *****
  • Публикации: 1286
  • Distribution: Ubuntu
  • Window Manager: Fluxbox
    • Профил
    • WWW
Използвам 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

  • Напреднали
  • *****
  • Публикации: 408
    • Профил
    • WWW
Не разбрах какво искаш да постигнеш и кое точно време искаш. Ако е времето на стартиране на процеса, както си описал можеш да го вземеш с
Примерен код
ps u| grep wput | awk '{print $9}'



P.S. По интересно е защо wput забива  '<img'>  '<img'>



Активен

http://blog-nikolavp.rhcloud.com - простотиите, с които се занимавам в свободното време

vstoykov

  • Напреднали
  • *****
  • Публикации: 1286
  • Distribution: Ubuntu
  • Window Manager: Fluxbox
    • Профил
    • WWW
Благодаря за кода. Това с awk е интересно - аз нямаше да се сетя да го направя така - щях да ползвам
Примерен код

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

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

#!/bin/bash
read STRING
echo $STRING
                             


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

По-лесно става като се стартира отново '<img'>

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

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



Активен

vstoykov

  • Напреднали
  • *****
  • Публикации: 1286
  • Distribution: Ubuntu
  • Window Manager: Fluxbox
    • Профил
    • WWW
Трябва да се добави и
Примерен код

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

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Какво значи "забива" ?

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

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

"Knowledge is power" - France is Bacon

vstoykov

  • Напреднали
  • *****
  • Публикации: 1286
  • Distribution: Ubuntu
  • Window Manager: Fluxbox
    • Профил
    • WWW
В случая под "забил" имам предвид да не извежда нищо на монитора и да не прекратява изпълнението си за неограничено дълго време.

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

vstoykov

  • Напреднали
  • *****
  • Публикации: 1286
  • Distribution: Ubuntu
  • Window Manager: Fluxbox
    • Профил
    • WWW
Скрипта е готов - настрох 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

  • Напреднали
  • *****
  • Публикации: 849
    • Профил
vstoykov,

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

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



Активен

A gentleman is one who is never rude unintentionally. - Noel Coward