Does systemd provide some protection against this […]?
Usted está asumiendo que debería. Por el contrario, considere configuraciones como
TTYPath
y servicios comogetty@.service
. La capacidad de obtener un terminal de control es en realidad necesaria , para que la gestión de servicios pueda abarcar los servicios de inicio de sesión de TTY, que deben hacer precisamente eso.Lo que realmente protege contra esto es alejarse de la asignación automática de un terminal de control en
open()
y descartar la semántica antigua. O protegería contra ella. No es el caso en Linux, pero en FreeBSD, NetBSD, OpenBSD y Hurd hoy en día la banderaO_NOCTTY
aopen()
es completamente superflua. La única forma de adquirir una terminal de control es exigiéndola explícitamente, conioctl(…TIOSCTTY)
. Este ha sido el caso durante casi un cuarto de siglo, desde los días de 4.4BSD.Mientras tanto, el hábito de entrar en Linux es el hábito que también ha sido el caso durante mucho tiempo, mucho antes de systemd:
O_NOCTTY
en todas partes . & #9786;(Sí, las bibliotecas GNU y musl C no te dan esto por
fopen()
. Esta es una de varias razones por las quefdopen()
sigue siendo un mecanismo útil.)La gestión de servicios con el conjunto de herramientas de nosh
service-manager
toma un rumbo ligeramente diferente en esto. En lugar de convertir siempre los procesos daemon en líderes de sesión, a cada servicio se le asigna su propio objeto de sesión del kernel que luego no tiene uso, solo los servicios específicos también se encadenan a través desetsid
explícitamente; tales comottylogin@*
servicios que utilizanopen-controlling-tty
,agetty@*
servicios donde, por supuesto,agetty
configura el terminal de control ygetty@*
servicios. (Como se indica en la fuente del servicio,mgetty
se llamasetsid()
a sí mismo.)Lecturas adicionales
- Jonathan de Boyne Pollard (2018 ).
setsid
.Guía de comida . Softwares.- Jonathan de Boyne Pollard (2018 ).
open-controlling-tty
. Guía de comida . Softwares.- Jonathan de Boyne Pollard (2015 ). La herencia y la falacia de demonización ". No más problemas con el comando
service
. nosh blurb. Softwares.- Jonathan de Boyne Pollard (2001 ). " No
fork()
para 'poner el demonio en segundo plano'. ". Errores a evitar al diseñar programas daemon Unix . Respuestas dadas con frecuencia.- Jonathan de Boyne Pollard. " Inicio de sesión de terminal virtual ". Guía de comida . Softwares.
- Jonathan de Boyne Pollard. " Inicio de sesión de terminal real ". Guía de comida . Softwares.
- http://git.musl-libc.org/cgit/musl/tree/src/stdio/__fmodeflags.c
- https://github.com/lattera/glibc/blob/a2f34833b1042d5d8eeb263b4cf4caaea138c4ad/libio/fileops.c#L274
Черезawk
динамическую переменную/аргумент-v <var>=<value>
:
Тестовый пример для строкиz
:
awk -v s="z" '$2==s{ c++ }END{ printf "%s \042%s\042\n", (c? c : "no"), s }' file
Выход:
3 "z"
Тестовый пример для строкиw
:
awk -v s="w" '$2==s{ c++ }END{ printf "%s \042%s\042\n", (c? c : "no"), s }' file
Выход:
no "w"
Если я правильно понял, вы хотите проверить, имеет ли второй столбец определенный алфавит, если да, попробуйте ниже awk
скрипт, который сообщит, какой из них существует с соответствующим количеством, а какой нет с "NOT FOUND!"
замечание.
awk -v alphabet="$(printf "%s" {a..z})" 'BEGIN{ split(alphabet, arr, "") }
{ chrs[$2]++ } END{ for(y in chrs) for(x in arr)
{ if(arr[x] in chrs) {print y, chrs[y]; delete arr[x]; break }
else{ print arr[x]" NOT FOUND!"; delete arr[x] }
}
}' infile
Выход:
w 1
z 3
a 1
b 1
c 1
f NOT FOUND!
g NOT FOUND!
h NOT FOUND!
i NOT FOUND!
j NOT FOUND!
k NOT FOUND!
l NOT FOUND!
m NOT FOUND!
n NOT FOUND!
o NOT FOUND!
p NOT FOUND!
q NOT FOUND!
r NOT FOUND!
s NOT FOUND!
t NOT FOUND!
u NOT FOUND!
v NOT FOUND!
d 1
x NOT FOUND!
y NOT FOUND!
e 1