Использование systemd для предотвращения сбоев сценариев python

Взяв за основу код Брюса, вот более эффективная реализация которая не хранит все данные в памяти.  Как указано в вопросе, предполагается, что входной файл имеет (по крайней мере) одно число в строке.  Он подсчитывает строки во входном файле, которые содержат определяющее число и передает это количество команде awk вместе с (предшествующими) отсортированными данными.  Так, например, если файл содержит

6.0
4.2
8.3
9.5
1.7

то на вход команды awk фактически поступает

5
1.7
4.2
6.0
8.3
9.5

Тогда сценарий awk фиксирует счетчик данных в блоке кода NR==1 и сохраняет среднее значение (или два средних значения, которые усредняются для получения медианы) когда видит их.

FILENAME="Salaries.csv"

(awk 'BEGIN {c=0} $1 ~ /^[-0-9]*(\.[0-9]*)?$/ {c=c+1;} END {print c;}' "$FILENAME"; \
        sort -n "$FILENAME") | awk '
  BEGIN {
    c = 0
    sum = 0
    med1_loc = 0
    med2_loc = 0
    med1_val = 0
    med2_val = 0
    min = 0
    max = 0
  }

  NR==1 {
    LINES = $1
    # We check whether numlines is even or odd so that we keep only
    # the locations in the array where the median might be.
    if (LINES%2==0) {med1_loc = LINES/2-1; med2_loc = med1_loc+1;}
    if (LINES%2!=0) {med1_loc = med2_loc = (LINES-1)/2;}
  }

  $1 ~ /^[-0-9]*(\.[0-9]*)?$/  &&  NR!=1 {
    # setting min value
    if (c==0) {min = $1;}
    # middle two values in array
    if (c==med1_loc) {med1_val = $1;}
    if (c==med2_loc) {med2_val = $1;}
    c++
    sum += $1
    max = $1
  }
  END {
    ave = sum / c
    median = (med1_val + med2_val ) / 2
    print "sum:" sum
    print "count:" c
    print "mean:" ave
    print "median:" median
    print "min:" min
    print "max:" max
  }
'
1
18.02.2018, 08:22
1 ответ

Sus definiciones de servicio son así:

[Service]
ExecStart=python /home/pi/projects/script1.py
Restart=always

Y este es el mensaje de error en cada uno de ellos:

Executable path is not absolute, ignoring: python /home/pi/...

Para systemd, el "ejecutable" en esta definición de servicio es python, y claramente no es una ruta absoluta. El /home/pi/projects/script1.pyes solo un argumento para este pythonejecutable, y el trabajo del ejecutable es cuidar su forma adecuada.

Cualquier variable de entorno específica de Python -como PYTHONPATHno tiene ningún significado parasystemd:usted debe darle una ruta absoluta para el ejecutable en la definición del servicio, todas y cada una de las veces.

Por lo general, la ruta absoluta al intérprete de python es /usr/bin/python, pero puede verificar:

$ type python
python is /usr/bin/python

Entonces sus definiciones de servicio deberían ser así:

[Service]
ExecStart=/usr/bin/python /home/pi/projects/script1.py
Restart=always

Puede encontrar una introducción muy útil a systemd aquí. Obtiene y mantiene un bot de Telegram ejecutándose como un script de Python.

1
28.01.2020, 00:39

Теги

Похожие вопросы