Что такое хорошая стратегия кода ошибки выхода Linux?

Я нашел обходной путь для этого, используя функцию to_utc_timestamp в pyspark, однако не совсем уверен, является ли это наиболее эффективным, хотя, похоже, он отлично работает на примерно 100 млн строк данных. Вы можете избежать regex_replace, если ваша строка метки времени выглядела так - 1997-02-28 10: 30: 40.897748

 from pyspark.sql.functions import regexp_replace, to_utc_timestamp

 df = spark.createDataFrame([('19970228-10:30:40.897748',)], ['new_t'])
 df = df.withColumn('t', regexp_replace('new_t', '^(.{4})(.{2})(.{2})-', '$1-$2-$3 '))
 df = df.withColumn("time", to_utc_timestamp(df.t, "UTC").alias('t'))
 df.show(5,False)
 print(df.dtypes)
5
задан Chris Kloberdanz 26 December 2008 в 14:40
поделиться

5 ответов

Единственная конвенция состоит в том, что Вы возвращаетесь 0 для успеха и чего-то другого, чем нуль для ошибки. Самые известные программы Unix документируют различные коды возврата, которые они могут возвратить и Вы - также. Это не имеет большой смысл попытаться войти в общий список для всех возможных кодов ошибок, которые могла возвратить любая произвольная программа, или иначе Вы заканчиваете с десятками тысяч их как некоторая другая ОС, и даже затем, это не всегда покрывает определенный тип ошибки, которую Вы хотите возвратить.

Поэтому просто будьте последовательны, и будьте обязательно зарегистрировать безотносительно схемы, которую Вы решаете использовать.

8
ответ дан 18 December 2019 в 07:32
поделиться

1-127 доступный диапазон. Что-либо более чем 127, как предполагается, являются "аварийным" выходом - завершенный сигналом.

В то время как Вы в нем, рассматриваете использование stdout, а не кода выхода. Код выхода по традиции, раньше указывал на успех, отказ, и может быть еще одно состояние. Вместо того, чтобы использовать код выхода, попытайтесь использовать stdout, путь expr и туалет используют его. Можно затем использовать обратную галочку или что-то подобное в вызывающей стороне для извлечения результата.

6
ответ дан 18 December 2019 в 07:32
поделиться

состояния манифеста Unix -

Выход настолько скоро и столь же громкий насколько возможно на ошибке

или что-то как этот

4
ответ дан 18 December 2019 в 07:32
поделиться

Не пытайтесь закодировать слишком много значения в значение выхода: подробные состояния и сообщения об ошибке должны перейти к stdout / stderr, как Arkadiy предполагает.

Однако я нашел очень полезным представить просто горстку состояний в значениях выхода, с помощью двоичных единиц информации для кодирования их. Например, предположите, что у Вас есть следующие изобретенные значения:

0000 : 0 (no error)
0001 : 1 (error)
0010 : 2 (I/O error)
0100 : 4 (user input error)
1000 : 8 (permission error)

Затем ошибка ввода данных пользователем имела бы возвращаемое значение 5 (4 + 1), в то время как файл журнала, не имеющий разрешение записи, мог бы иметь возвращаемое значение 11 (8 + 2 + 1). Поскольку различные значения независимо кодируются в возвращаемом значении, можно легко видеть то, что произошло путем проверки, какие биты установлены.

Как особый случай, чтобы видеть, была ли ошибка, Вы можете И код возврата с 1.

Путем выполнения этого можно закодировать несколько разных вещей в коде возврата ясным и простым способом. Я использую это только для принятия простых решений тех, которые "должны процесс быть перезапущенными", "делают возвращаемое значение и соответствующие журналы должны быть отправлены администратору", такая вещь. Любая подробная диагностическая информация должна перейти к журналам или к stdout / stderr.

2
ответ дан 18 December 2019 в 07:32
поделиться

Нормальные статусы выхода работают от 0 до 255 (см. Коды выхода, больше, чем 255 возможных для обсуждения почему). Обычно, состояние 0 указывает на успех; что-либо еще - определенная реализацией ошибка. Я действительно знаю о программе, которая сообщает о состоянии сервера DBMS через статус выхода; это - особый случай определенных реализацией статусов выхода. Обратите внимание, что Вы добираетесь для определения реализации состояний программ.

Я не мог вместить это в 300 символов; иначе это был бы комментарий к ответу @Arkadiy.

Arkadiy прав, что в одной части слова статуса выхода, значения кроме нуля указывают на сигнал, который завершил процесс, и 8-й бит обычно указывает на дамп ядра, но тот раздел статуса выхода отличается от основного 0.. 255 состояний. Однако оболочке (какой бы ни оболочка это) дарят проблему, когда процесс умирает в результате сигнала. Существует 16 битов данных, которые будут представлены в 8-разрядном значении, которое всегда хитро. То, что оболочки, кажется, делают, должно взять число сигнала и добавить 128 к нему. Так, если процесс умирает в результате прерывания (сигнал номер 2, SIGINT), оболочка сообщает о статусе выхода как 130. Однако ядро сообщило о состоянии как 0x0002; оболочка изменила то, о чем сообщает ядро.

Следующий код C демонстрирует это. Существует две программы

  • suicide который уничтожает себя с помощью сигнала выбора (прерывание по умолчанию).
  • exitstatus который выполняет команду (такой как suicide) и сообщает о статусе выхода ядра.

Вот suicide.c:

/*
@(#)File:           $RCSfile: suicide.c,v $
@(#)Version:        $Revision: 1.2 $
@(#)Last changed:   $Date: 2008/12/28 03:45:18 $
@(#)Purpose:        Commit suicide using kill()
@(#)Author:         J Leffler
@(#)Copyright:      (C) JLSS 2008
@(#)Product:        :PRODUCT:
*/

/*TABSTOP=4*/

#if __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 600
#else
#define _XOPEN_SOURCE 500
#endif /* __STDC_VERSION__ */

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "stderr.h"

static const char usestr[] = "[-V][-s signal]";

#ifndef lint
/* Prevent over-aggressive optimizers from eliminating ID string */
extern const char jlss_id_suicide_c[];
const char jlss_id_suicide_c[] = "@(#)$Id: suicide.c,v 1.2 2008/12/28 03:45:18 jleffler Exp $";
#endif /* lint */

int main(int argc, char **argv)
{
    int signum = SIGINT;
    int opt;
    char *end;

    err_setarg0(argv[0]);

    while ((opt = getopt(argc, argv, "Vs:")) != -1)
    {
        switch (opt)
        {
        case 's':
            signum = strtol(optarg, &end, 0);
            if (*end != '\0' || signum <= 0)
                err_error("invalid signal number %s\n", optarg);
            break;
        case 'V':
            err_version("SUICIDE", &"@(#)$Revision: 1.2 $ ($Date: 2008/12/28 03:45:18 $)"[4]);
            break;
        default:
            err_usage(usestr);
            break;
        }
    }
    if (optind != argc)
        err_usage(usestr);
    kill(getpid(), signum);
    return(0);
}

И вот exitstatus.c:

/*
@(#)File:           $RCSfile: exitstatus.c,v $
@(#)Version:        $Revision: 1.2 $
@(#)Last changed:   $Date: 2008/12/28 03:45:18 $
@(#)Purpose:        Run command and report 16-bit exit status
@(#)Author:         J Leffler
@(#)Copyright:      (C) JLSS 2008
@(#)Product:        :PRODUCT:
*/

/*TABSTOP=4*/

#if __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 600
#else
#define _XOPEN_SOURCE 500
#endif /* __STDC_VERSION__ */

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "stderr.h"

#ifndef lint
/* Prevent over-aggressive optimizers from eliminating ID string */
extern const char jlss_id_exitstatus_c[];
const char jlss_id_exitstatus_c[] = "@(#)$Id: exitstatus.c,v 1.2 2008/12/28 03:45:18 jleffler Exp $";
#endif /* lint */

int main(int argc, char **argv)
{
    pid_t pid;

    err_setarg0(argv[0]);

    if (argc < 2)
        err_usage("cmd [args...]");

    if ((pid = fork()) < 0)
        err_syserr("fork() failed: ");
    else if (pid == 0)
    {
        /* Child */
        execvp(argv[1], &argv[1]);
        return(1);
    }
    else
    {
        pid_t corpse;
        int status;
        corpse = waitpid(pid, &status, 0);
        if (corpse != pid)
            err_syserr("waitpid() failed: ");
        printf("0x%04X\n", status);
    }
    return(0);
}

Недостающий код, stderr.c и stderr.h, может легко быть найден в по существу любой из моих опубликованных программ. Если Вы нуждаетесь в нем срочно, получаете его из программы SQLCMD в Архиве IIUG Software; альтернативно, свяжитесь со мной по электронной почте (см. мой профиль).

1
ответ дан 18 December 2019 в 07:32
поделиться
Другие вопросы по тегам:

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