Как процесс, может казаться, имеет другое имя в выводе PS?

Вы могли split поле и использование substr :

split($9, a, ";")
print substr(a[1], 4)

Индексы Awk запускаются в 1.

Другая опция могла состоять в том, чтобы изменить разделитель поля ввода (FS). FS пространство, "", по умолчанию – который также имеет специальный эффект игнорирования продвижения и конечных пробелов.

Кроме того, вместо использования print $1, \t, ... или printf вариант можно было установить OFS к вкладке.


Примеры:

Изменение FS:

awk -F" +|;|=" '

$3 == "gene" {
    printf("%s\t%s\t%s\t%s\t%s\t%s\t\n",
    $1, $4, $5, $10, $6, $7);
}
' data.file

Используя разделение:

awk '
$3 == "gene" {
    split($9, a, ";")
    printf("%s\t%s\t%s\t%s\t%s\t%s\t\n",
    $1, $4, $5, substr(a[1], 3), $6, $7);
}
' data.file

OFS и FS:

Произведите разделителя полей (OFS) как вкладка и альтернатива FS внутри awk. Также обновленный FS включать вкладку:

awk '
BEGIN {
    FS="[ \t]+|;|="
    OFS="\t"
}
$3 == "gene" {
    print $1, $4, $5, $10, $6, $7
}

' data.file

Также посмотрите Переменные Open Group и Специальные переменные, Примеры.

Руководство простофили – обычно отмечается, когда вещами является расширение простофили awk.

8
12.11.2014, 09:19
4 ответа

Манипулирование именем в списке процессов - это обычная практика. Например. У меня в моем процессе перечислены следующие:

root      9847  0.0  0.0  42216  1560 ?        Ss   Aug13   8:27 /usr/sbin/dovecot -c /etc/dovecot/d
root     20186  0.0  0.0  78880  2672 ?        S    Aug13   2:44  \_ dovecot-auth
dovecot  13371  0.0  0.0  39440  2208 ?        S    Oct09   0:00  \_ pop3-login
dovecot   9698  0.0  0.0  39452  2640 ?        S    Nov07   0:00  \_ imap-login
ericb     9026  0.0  0.0  48196  7496 ?        S    Nov11   0:00  \_ imap [ericb 192.168.170.186]

Dovecot использует этот механизм, чтобы легко показать, что делает каждый процесс.

Это в основном так просто, как манипулирование параметром [0] ARGV [0] [11] параметра в C. ARGV - это массив указателей на параметры, с которыми начался процесс. Таким образом, команда ls -l / ue / directory будет иметь:

argv[0] -> "ls"
argv[1] -> "-l"
argv[2] -> "/some/directory"
argv[3] -> null

путем выделения некоторой памяти, поместив несколько текстов в этой памяти, а затем поместив адрес этой памяти в ARGV [0] Показанное имя процесса будет изменено на новый текст.

4
27.01.2020, 20:11

На языке, как C , процесс может изменить его имя путем изменения ARGV [0] .

Пример:

#include <stdio.h>

int main(int argc, char *argv[]) {
    argv[0][2] = 'A';
    sleep(10);
    return 0;
}

Затем компилируйте его:

$ gcc test.c
$ ls
a.out
$ ./a.out

в другом терминале:

$ ps -ef | grep '[a].out'
$ ps -ef | grep '[A].out'
cuonglm  17979 17569  0 14:51 pts/0    00:00:00 ./A.out

Язык более высокого уровня также позволяет сделать это, пример в Perl , вы можете изменить $ 0 Переменная для изменения имени процесса.

3
27.01.2020, 20:11

Изменение argv [] не переносимо. В Linux вы также не можете просто изменить argv [0], чтобы он указывал на более длинную строку. Вам придется перезаписать существующие аргументы и позаботиться о том, чтобы не перезаписать переменные среды, которые следуют в адресном пространстве.

libbsd предоставляет реализацию setproctitle (3) для Linux, которая значительно упрощает эту задачу.

4
27.01.2020, 20:11

Существует два стандартных -Linux-способа сделать это, один из которых исходит от glibc и может быть переносим на другие системы, не -Linux:

Возможно, изменение argv[0]раньше работало, но, по крайней мере, в моей текущей системе Linux это никак не влияет на вывод в ps.

См. этот ответ для получения более подробной информации и примера кода:https://stackoverflow.com/a/55584492/737303

5
27.01.2020, 20:11

Теги

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