Как запустить приложение node.js при загрузке машины, создав загрузочную службу

Я благодарен за предоставленный код user78605 , так как он помог мне найти медиану в моих запросах. Однако в вышеупомянутом коде не учитываются определенные условия, необходимые для правильного вычисления медианы.

Проблемы:

  1. Пустые завершающие строки (если они существуют в файле) не должны учитываться, поскольку их подсчет влияет на размер данных и, следовательно, на средний, медианный, режим, а также на другие статистические величины.Скорее всего, то же самое следует сделать для строк, которые не имеют числовых значений (id est: «abc» , «28b» , «h2f» , "" и так далее).
  2. Медиана - это среднее значение не исходного набора данных, а упорядоченного набора данных. То есть сначала необходимо отсортировать данные, для которых нужно найти медианное значение.
  3. Если количество значений в упорядоченном наборе данных четное, необходимо взять среднее из двух средних значений.
  4. Mode - это значение, имеющее самую высокую частоту. Набор данных может иметь более одного режима, и в этом случае два или более значения должны быть указаны как режим.

Ниже приводится мое расширение кода с учетом вышеупомянутых условий:

awk -F',' '
{col=$1}{if((col ~  /^-?[0-9]*([.][0-9]+)?$/) && ($0!=""))                 
{
     sum+=col;
     a[x++]=col;
     b[col]++
     if(b[col]>hf){hf=b[col]}
}
}
END{n = asort(a);idx=int((x+1)/2)
     print "Mean: " sum/x
     print "Median: " ((idx==(x+1)/2) ? a[idx] : (a[idx]+a[idx+1])/2)
     for (i in b){if(b[i]==hf){(k=="") ? (k=i):(k=k FS i)}{FS=","}}
     print "Mode: " k
}' file

ОБЪЯСНЕНИЕ:

Решение проблемы №1:

col = $ 1 # легче изменить столбцы, если хранится в переменной.
(col ~ /^-?[0-9 ]*([.pting[0-9 ]+)?$/) # Строка должна содержать только цифры, точку (десятичный разделитель) или тире (знак минус). [Не учитывается только научное обозначение.]
($ 0! = "") # вся строка не должна быть пустой.

В соответствующих строках выполните следующие операции цикла:

sum + = col # (Сокращение от sum = sum + col .) Сумма всех значений.
a [x ++] = col # Каждое значение сохраняется в массиве.
b [col] ++ # Значения в col обрабатываются как суррогатные ключи массива b . Следовательно, в b только столько элементов, сколько уникальных значений в col .Этот итератор создает массив значений частоты. (Сокращение от b [col] = b [col] +1 .)
if (b [col]> hf) {hf = b [col]} #Let hf означает «самая высокая частота». Переберите все частоты и обновите hf , только если будут обнаружены более высокие частоты. hf изначально "" (ничего).

Решение проблемы №2:
После завершения операций цикла:

Отсортируйте значения, хранящиеся в массиве: n = asort (a)

Это важно отметить, что исходные индексы массива a варьировались от «0» до «x-1». Помимо сортировки, новый диапазон индекса составляет от «1» до «x». Вот почему я использую int ((x + 1) / 2) вместо
int ((x-1) / 2) в качестве индекса, который содержит медиану - или меньшее из двух чисел, которые будут усреднены до медианы.

Решение проблемы №3:

((idx == (x + 1) / 2)? a [idx]: ( a [idx] + a [idx + 1]) / 2)
Это сокращенное обозначение конструкции if-else:
If int ((x + 1) / 2) равно (x + 1) / 2 , тогда количество значений нечетное, а медиана будет a [idx] . Если это не так, int () округлит (x + 1) / 2 в меньшую сторону до ближайшего целого числа, означающего, что количество значений четное. В этом случае среднее значение a [idx] и a [idx] +1 будет медианным.

Решение проблемы №4:

для (i in b) {if (b [i] == hf) {(k == "")? (k = i) :( k = k FS i)} {FS = ","}}
Поскольку hf - это значение, которое представляет наивысшую частоту в наборе данных, если любое значение b равно hf , его суррогатный ключ - это режим или, по крайней мере, один из режимов.
Этот код объединяет все суррогатные ключи, i , которые соответствуют критерию, и сохраняет их в переменной, k , который может быть напечатан в одной строке с заголовком «Режим».

Дополнительные настройки:

-F следует настроить в соответствии с тем, какой символ используется в качестве разделителя столбцов в файле.

Если в первой строке файла есть заголовки, добавьте NR> 1 перед {col = $ 1} .

FS использовалась для объединения двух переменных. Использование FS особенно полезно, когда кто-то решает не использовать разделитель. То есть FS = "" .

Данные

Следующие данные использовались для экспериментов с целью создания сценария:

10
20
10
20.5
50
30
40
50
10
30
20.5


-h
h

4.35
-537
0
-0

30
d




.

РЕЗУЛЬТАТЫ:

Mean: -13.2281
Median: 20.25
Mode: 10,30
0
03.05.2018, 21:00
1 ответ

Hay múltiples formas de lograr esto PM2 Puede usar PM2, que le permite crear un script de inicio para iniciar los reinicios esperados o inesperados de la máquina.

http://pm2.keymetrics.io/docs/usage/startup/

Docker Prefiero crear Dockerfile y ejecutarlo con --reiniciar = etiquetar siempre

Si desea continuar con su script de shell Luego use el crontab de Unix. Es muy fácil de usar y puede configurarlo en minutos

  1. Edite crontab, ejecute lo siguiente reemplazando el "USUARIO" con el usuario de tiempo de ejecución deseado para el proceso del nodo. Si elige un usuario diferente que no sea usted mismo, deberá ejecutar esto con sudo.

    $ crontab -u USUARIO -e

  2. Una vez en el editor agregue la siguiente línea:

    @reboot /usr/local/bin/forever start /your/path/to/your/index.js más

    @reboot sh /su/ruta/hacia/su/startApp.sh

  3. Guardar y confirmar que el archivo se guardó mediante el comando de verificación de #1 nuevamente

    Nota :En mi opinión, debe usar la ruta completa en el archivo crontab para evitar problemas

Puede referir esta URL de referencia Manual de Ubuntu Cron

3
28.01.2020, 02:32

Теги

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