Понимание вращения системного журнала, для реализации собственного вращения системного журнала

Я бы хотел найти обычный образец для включения в сценарий оболочки, чтобы что n переменных будет содержать n аргументов

Далее создается массив оболочки arglist , содержащий каждый из аргументов:

$ readarray -t arglist < <(echo "\command{arg1,
    arg2 ,
    arg3
    }" | sed -n '/\\command/{ :a;/}/!{N;b a}; s/\\command{//; s/[ \n}]//g; s/,/\n/g; p}')

С помощью оператора declare можно увидеть, что он работал:

$ declare -p arglist
declare -a arglist='([0]="arg1" [1]="arg2" [2]="arg3")'

Вот еще один пример с аргументами в одной строке:

$ readarray -t arglist < <(echo "\command{arg1, arg2, arg3, arg4}"  | sed -n '/\\command/{ :a;/}/!{N;b a}; s/\\command{//; s/[ \n}]//g; s/,/\n/g; p}')

Опять же, он работает:

$ declare -p arglist
declare -a arglist='([0]="arg1" [1]="arg2" [2]="arg3" [3]="arg4")'

Обратите внимание, что космос в Мы перенаправляем входные данные из подстановки процесса. Без космоса bash попробует что-то другое целиком.

Принцип работы

Команда sed немного тонка. Давайте посмотрим на это кусок за раз:

  • -n

    Не печатайте строки, если явно не спрашивается.

  • /\command/{...}

    При обнаружении строки, содержащей \command , выполните следующие команды в фигурных скобках:

  • : a ;/}/! {N; b; b}

    При этом строки считываются в буфер образца до тех пор, пока не будет найдена строка, содержащая } . Таким образом, мы получаем всю команду сразу.

  • s/\\command {//

    Удалите \command { последовательности.

  • s/[\n} ]//g

    Удаление всех мест, закрывающих фигурных скобок и новых строк.

  • s/,/\n/g

    Замените запятые новыми строками. Когда это делается, каждый аргумент находится в отдельной строке, которая является тем, что readarray хочет.

  • p

    Печать.

-121--70738-

Если вы не уверены, какой init, вы можете угадать из ps | grep -E «systemd 'upstart» . (Некоторые блестящие системы могут присутствовать в устаревших системах запуска, но не наоборот, я думаю). Вы также можете проверить наличие супервизора.

Googling initd говорит мне о /etc/init.d так что я предполагаю, что это то, что вы имели в виду... Извините, но ничего не приходит в голову для обнаружения sysV init-скриптов других , чем поиск в/etc. (Если вы застряли на sysvinit, я предполагаю, что вы дополнительно хотите /etc/init.d/foo status или service foo status , чтобы убедиться, что ваш сервис действительно выполняется из sysvinit. Это не означает, что сервис, к сожалению, был запущен из и sysvinit, и supervisord).

На старте я думаю, что это легко найти работу, потому что initctl list показывает pids. Так что если он там, то это либо задание запуска, либо sysV init-скрипт, работающий под обратной совместимостью (и см. выше, чтобы обнаружить разницу).

В systemd можно проверить данный pid с помощью поля групп ps , см. ниже. Если группа говорит .service , она должна быть запущена systemd. Если вы не против поиска (потенциально неоднозначного) процесса name , то systemd-cgls легче запомнить. Тогда я думаю, что systemctl status foo даже даст вам достаточно информации для обнаружения sysV init-script для foo.service.

 $ ps xawf -eo pid, пользователь, группа, аргументы
КОМАНДА CGROUP ПОЛЬЗОВАТЕЛЯ PID
2 корень -[kthreadd]
3 корень -\_ [ksoftirqd/0]
[...]
4281 root -\_ [flush-8: 0]
1 корневое имя = systemd :/systemd-1/sbin/init
455 корневое имя = systemd :/systemd-1/sysinit.service/sbin/udevd -d
28188 root name = systemd :/systemd-1/sysinit.service\_/sbin/udevd -d
28191 root name = systemd :/systemd-1/sysinit.service\_/sbin/udevd -d
1096 dbus name = systemd :/systemd-1/dbus.service/bin/dbus-daemon --system --address = systemd: --nofork --systemd-activation
[...]

Для супервизора используйте статус супервизора .

-121--166887-

avahi-daemon

Avahi - низкоуровневый механизм обнаружения служб. Это имеет тенденцию использоваться всеми видами случайных вещей, таким образом, нет никакого способа, которым я могу сказать вам точно, кто использует его, и для какой.

Без извлечения packet sniffer и поиска, ваш выбор состоит в том, чтобы просто жить с ним или отключить всю службу и увидеть, что ломается.

dhclient

Это клиент DHCP . Он должен принимать пакеты UDP через порт 68. Если компьютер использует DHCP для настройки сети, необходимо оставить его открытым.

Если вы не используете DHCP на этом компьютере, вы можете просто полностью удалить dhclient .

cups-browsed

CUPS является подсистемой печати вашего дистрибутива Linux. Эту службу можно удалить, но это означает, что графический интерфейс пользователя не сможет найти новые принтеры, когда они появятся в сети. Вам придется вернуться к плохим старым дням ввода IP-адресов вручную.

(Если это не принтер Bonjour, то в этом случае его заберет Avahi. Однако обнаружение принтера - это лишь одно из многих действий, которое может сделать Avahi. Не поймите, что эти две услуги взаимно редуцированы. Широкий след Avahi просто происходит, чтобы перекрыть CUPS немного в этой области.)

Я бы не беспокоился об этой службе. Это не связано ни с чем очень чувствительным.

0
24.04.2015, 09:59
1 ответ

Обычно вращение лог-файла обрабатывается вне системного демона, например, с помощью инструмента logrotate . После поворота на системный демон посылается сигнал на повторное открытие всех лог-файлов. Это прекрасно работает в linux/unix, так как это не проблема переименования файлов, которые открываются другими процессами; я понимаю, что в Windows это может быть более проблематично.

EDIT: лог-файлы переименовываются, например, daemon.log становится daemon.log.0 или (желательно) daemon.log.20150423. Либо сразу, либо через один цикл, вращающийся файл сжимается с помощью gzip, хотя технически это никак не связано с самим вращением лог-файла, это просто для высвобождения места, и вы можете выбрать, чтобы сэкономить время и не производить сжатие, учитывая сегодняшние терабайтные диски.

1
28.01.2020, 02:51

Теги

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