Instalé daemontools-0.76 en un sistema CentOS 8 según los documentos oficiales aquí:http://cr.yp.to/daemontools.html.
Luego creé un servicio de prueba vinculado simbólicamente /service/test
con un run
archivo simple que repite el texto en la salida estándar (lo más básico posible). Tanto la carpeta de prueba como el archivo de ejecución tienen 755 permisos.
run
archivo:
#!/bin/sh
echo "test"
El archivo se ejecuta bien manualmente, por supuesto, e incluso puedo ejecutarlo /command/supervise /service/test
y el servicio se ejecuta como se esperaba. Puedo usarlo svc -u/-d <service>
para iniciar/detener a través del supervisor.
Sin embargo, cuando lo ejecuto /command/svscan /service
me sale el siguiente error:
svscan: warning: unable to start supervise test: permission denied
No he encontrado ninguna pista que indique qué permisos están en conflicto aquí. Cosas que he probado:
- Tanto con la
test/supervise
carpeta presente (creadasupervise
cuando se ejecuta manualmente) como con esta carpeta eliminada (es decir, iniciando el servicio desde cero); El mismo resultado de cualquier manera (nota:supervise
no se está ejecutando cuando intento iniciarsvscan
, aunque también intenté ejecutarlo en segundo plano con el mismo error) - Permisos verificados (755) en los propios comandos (bajo
/package/admin/daemontools-0.76/command/
) - Permisos verificados (755) en todas las carpetas (/command, /service, /package y la carpeta de servicio)
- Pensé que tal vez, dado que
/tmp
está montadonoexec
, podría ser un problema si algo intentara usar este directorio, pero volví a intentarlo montadoexec
y eso no ayudó. - Pensé que
strace
podría ayudar, pero no parece haber ningún problema que mi ojo inexperto pueda ver:
execve("/usr/local/bin/svscan", ["svscan", "/service"], 0x7ffc7385cfe8 /* 21 vars */) = 0
brk(NULL) = 0x1eab000
arch_prctl(0x3001 /* ARCH_??? */, 0x7fff479dd530) = -1 EINVAL (Invalid argument)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=34379, ...}) = 0
mmap(NULL, 34379, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f7af1b35000
close(3) = 0
openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\2607\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=4176104, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7af1b33000
mmap(NULL, 3938144, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f7af1554000
mprotect(0x7f7af170d000, 2093056, PROT_NONE) = 0
mmap(0x7f7af190c000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b8000) = 0x7f7af190c000 mmap(0x7f7af1912000, 14176, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f7af1912000
close(3) = 0
arch_prctl(ARCH_SET_FS, 0x7f7af1b34500) = 0
mprotect(0x7f7af190c000, 16384, PROT_READ) = 0
mprotect(0x603000, 4096, PROT_READ) = 0
mprotect(0x7f7af1b3e000, 4096, PROT_READ) = 0
munmap(0x7f7af1b35000, 34379) = 0
chdir("/service") = 0
wait4(-1, 0x7fff479dd4fc, WNOHANG, NULL) = -1 ECHILD (No child processes)
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
brk(NULL) = 0x1eab000
brk(0x1ecc000) = 0x1ecc000
brk(NULL) = 0x1ecc000
getdents64(3, /* 3 entries */, 32768) = 72
stat("test", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("test/log", 0x7fff479dd430) = -1 ENOENT (No such file or directory)
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f7af1b347d0) = 2884
getdents64(3, /* 0 entries */, 32768) = 0
close(3) = 0
nanosleep({tv_sec=5, tv_nsec=0}, svscan: warning: unable to start supervise test: permission denied
¿Alguna idea?
Editar: Intenté exactamente estos mismos pasos en una máquina CentOS 7 y funciona correctamente. ¿Quizás sea un problema en las llamadas de glibc en el código base que no son compatibles con versiones posteriores (2.17 frente a 2.28)?