Я бы использовал awk
, если формат не отличается от предоставленного вами образца:
awk -F'[<>="[:blank:]]+' '
$2 == "domain" {group = $(NF-1)}
!(group == "group1" && $2 == "node" && $(NF-1) == "PQR")
' < dest.xml > new-dest.xml
чтобы удалить это Узел "PQR" в домене "group1".
$ diff -u dest.xml new-dest.xml
--- dest.xml 2013-02-22 07:01:48.732227421 +0000
+++ new-dest.xml 2013-02-22 07:02:16.111512820 +0000
@@ -1,6 +1,5 @@
<domain id="1" group_name="group1">
<node id="ABC">
- <node id="PQR">
<node id="XYZ">
</domain>
<domain id="2" group_name="group2">
Если вы имеете в виду, что хотите удалить этот узел из XML-файла на месте, то это невозможно. Вам нужно хотя бы переписать ту часть, которая находится после этого узел, чтобы сдвинуть данные на столько байтов назад.
В качестве альтернативы вы можете заменить этот узел пробелами, что означает, что вы можете уйти с заменой только этих байтов.
perl -ne '
if (/<domain.*group_name="(.*?)"/) {
$in = $1 eq "group1"
} elsif ($in && /<node id="PQR"/) {
s/./ /g;
seek STDOUT,tell(STDIN)-length$_,0;
print
}' < dest.xml 1<> dest.xml
Добавьте ; exit
после print
выше, если есть только один такой узел и вы хотите остановить обработку, как только найдете его.
getty
es uno de los programas Unix más antiguos. Está utilizando un programa funcional escrito por Wietse Venema, agetty
, que fue escrito cuando getty
tenía alrededor de veinte años.
Este programa se está ejecutando porque su sistema cree que tiene un terminal conectado a un dispositivo serie, con el nombre de archivo de dispositivo de caracteres /dev/ttyS0
. Cuando su sistema arrancó, un programa llamado systemd-getty-generator
vio ttyS0
en /sys/class/tty/console/active
, debido a que aparece después de console=
en la línea de comando del kernel. El generador hizo que la unidad de servicio de plantilla serial-getty@.service
se instanciara como serial-getty@ttyS0.service
; y este es el servicio cuyos intentos de activación está registrando.
El servicio proporciona registro de terminal -a través de ese dispositivo.
Por alguna razón (suponiendo que tiene una versión de systemd de 2014 o posterior ), su sistema es inconsistente,y ahora cree que /dev/ttyS0
no es un archivo de dispositivo de caracteres, y mucho menos un dispositivo de caracteres que es una terminal. systemd-getty-generator
pensó que estaba en el arranque. Hay al menos dos formas en las que podría haber cambiado. Lo cual, si es que ha ocurrido, no puede determinarse a partir de su pregunta.
Arreglar /dev/ttyS0
.
systemd-getty-generator
lo verificó. También deje de decirle al kernel en su línea de comando que es la consola. Si no se supone que es un dispositivo de caracteres, porque no tiene un puerto serie (con terminal conectado o sin ), entonces decirle al kernel que un puerto serie no -existente es la consola es simplemente incorrecto. systemd-getty-generator
porque su funcionalidad principal no es lo que desea. systemd-getty-generator
. páginas del manual systemd. freedesktop.org. agetty
. Páginas del manual de Ubuntu 15.04. En cualquier sistema Unix, getty
es el nombre tradicional de un proceso que presenta un aviso de inicio de sesión en una conexión de puerto serie (ya sea una terminal cableada o una línea de módem )y espera a que el usuario inicie sesión.
En un sistema moderno (físico ), los procesos getty
normalmente se encuentran proporcionando la solicitud de inicio de sesión en la consola virtual de modo de texto -(s ). Si el sistema tiene hardware de acceso remoto a la consola (como HP iLO, Sun/Oracle ILOM, Fujitsu IRMC u Oracle iDRAC ), a menudo proporcionan puertos seriales virtuales a los que se puede acceder estableciendo una conexión SSH a través de la interfaz de la consola remota, si el administrador del sistema simplemente configura un proceso getty
para el puerto serial correspondiente.
Esto suele ser mucho más confiable que usar una interfaz de consola remota basada en web -que usa Java o HTML5 :ya que un puerto serial virtual no tiene que emular un teclado de PC, no tiene que invertir -asigne los caracteres entrantes nuevamente a los códigos de escaneo del teclado y espere que el diseño del teclado realmente configurado en el sistema operativo del servidor coincida con el que se usó para la operación de asignación inversa -. Y en el lado de la salida, no tiene que intentar raspar la RAM de video para obtener una imagen visualizable.
En máquinas virtuales, los puertos seriales virtuales se pueden usar de la misma manera, por la misma razón :una conexión de puerto serial virtual necesita menos transformaciones en los datos que un "KVM virtual".
En su caso específico, el sistema operativo de la máquina virtual en la nube aparentemente está configurado para esperar un puerto serie virtual como /dev/ttyS0
, pero parece que el puerto serie virtual no existe en la máquina virtual en este momento. ¿Quizás fue utilizado en el proceso de inicialización de VM por la infraestructura de la nube?
Probablemente pueda cerrar el proceso getty
en /dev/ttyS0
, ya que no parece estar haciendo nada útil en este momento. Para hacer eso,estos comandos pueden ser la solución más simple:
systemctl stop serial-getty@ttyS0.service
systemctl disable serial-getty@ttyS0.service
El primer comando le dice a systemd
que deje de intentar iniciar el proceso hasta el próximo reinicio, el segundo comando lo marcará persistentemente como deshabilitado.
Hasta que utilice el segundo comando, el primer comando se puede deshacer simplemente reiniciando el sistema. Entonces, si no está seguro, puede usar el primer comando y esperar unos días para ver si causa algún problema. Si encuentra que ahora no se puede acceder a su VM, un simple reinicio devolvería las cosas a lo que solían ser.
Como en la respuesta de JdeBP , también debe verificar sus opciones de arranque :si console=ttyS0
aparece allí, systemd
generará automáticamente un proceso getty
en /dev/ttyS0
.
Я решил это, отредактировав /etc/systemd/journald.conf
и установив
MaxLevelSyslog=warning