Динамическое изменение PID -Процесс nohup нельзя убить -Linux

Дополнение к прекрасному ответу @steeldriver .

7432/1000 не является целым числом. awkвнутренне использует тип компилятора C doubleдля представления чисел с плавающей запятой. В системах GNU на x86 это IEEE 754 binary64.

Точно так же, как 1/3 не может быть представлено в десятичном виде (, то есть 0,33333 с бесконечным числом троек ), 7432/1000 не может быть представлено в двоичном формате. awkприближение doubleэтого числа представляет собой двоичное число, которое при преобразовании обратно в десятичное равно (в точности )7,4320000000000003836930773104541003704071044921875.

Теперь, в awk, когда не -целые числа преобразуются в строковое представление, точное значение двоичного внутреннего представления не полностью сохраняется. Это было бы не очень полезно, учитывая, что в любом случае большинство этих цифр на самом деле представляют собой ошибку. Вместо этого числа с плавающей запятой преобразуются обратно в строку с помощью специального параметра CONVFMT, который содержит формат, аналогичный printf

.

По умолчанию CONVFMTравно %.6g. Это означает, что при преобразовании в строку сохраняется только 6 десятичных цифр точности. Это можно изменить на что угодно, хотя обратите внимание, что переносимыми являются только спецификаторы с плавающей запятой (%e, %f, %g... ).

Эти числа преобразуются в строку, когда они используются в качестве аргумента для функций или операторов, которые ожидают строки, например substr(), конкатенация...

Одним из них, как сказал @steeldriver, являются ключи к ассоциативным массивам, которые всегда являются строками.

Таким образом, выполнение a[7432/1000] = xна самом деле означает выполнение a[sprintf(CONVFMT, 7432/1000)]. При значении по умолчанию CONVFMTэто становится a["0.7432"] = x, но если CONVFMTизменить на %.1e, это будет a["7.0e-01"] = x, или если это было %.25g, это будет a["7.4320000000000003837"] = x.

Таким образом, здесь вы можете использовать CONVFMT=%.0f, чтобы убедиться, что ключи массива являются целыми числами:

$ awk -v CONVFMT=%.0f 'BEGIN{a[7432/1000] = 1; print a[7]}'
1

Однако обратите внимание, что %.0fокругляет до ближайшего целого числа, а %dусекает десятичную часть.Использование CONVFMT=%dне является переносимым, хотя будет работать с gawkи mawk:

.

$ gawk -v CONVFMT=%d 'BEGIN{a[7564/1000] = 1; print a[7]}'
1
$ gawk -v CONVFMT=%.0f 'BEGIN{a[7564/1000] = 1; print a[8]}'
1

¹ не распространяется на аргументы с плавающей запятой для print, которые вместо этого преобразуются с использованием OFMT

1
17.06.2021, 10:36
1 ответ

Предположим, что команда процесса отображается как 'python src/myscript.py'в списках процессов, таких как ps, top, htopи т. д.:-

killall -s STOP 'python src/myscript.py'приостанавливает процессы; -s CONT возобновит их,

Чтобы увидеть все сигналы, killall -l, но отправка TERM должна завершить их -, а ABRT должна их принудительно удалить.

1
28.07.2021, 11:24

Теги

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