AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-272848

Stewart's questions

Martin Hope
Stewart
Asked: 2025-04-15 15:34:48 +0800 CST

Aplique o patch do Debian Quilt no arquivo original com terminações de linha do DOS

  • 6

Tenho um arquivo com terminações de linha no estilo DOS em um *.orig.tar.xzpacote de código-fonte que preciso corrigir antes de compilar um 3.0 (quilt)pacote Debian. Meu patch atualmente tem terminações de linha no estilo Unix.

Podemos inspecionar os arquivos para ver se o patch tem 29 terminações de linha no estilo Unix e se o arquivo de origem tem 5000 terminações de linha no estilo Dos.

$ dos2unix -i debian/patches/model_icd CONFIG/model_config_file.txt
       0      29       0  no_bom    text    debian/patches/model_icd
    5000       0       0  no_bom    text    CONFIG/model_config_file.txt

Resultados da construção:

$ dpkg-buildpackage
...
 dpkg-source --before-build .
dpkg-source: info: using patch list from debian/patches/series
dpkg-source: info: applying model_icd
patching file CONFIG/model_config_file.txt
Hunk #1 FAILED at 1638 (different line endings).
Hunk #2 FAILED at 4997 (different line endings).
2 out of 2 hunks FAILED
dpkg-source: info: the patch has fuzz which is not allowed, or is malformed
dpkg-source: info: if patch 'model_icd' is correctly applied by quilt, use 'quilt refresh' to update it
dpkg-source: info: restoring quilt backup files for model_icd
dpkg-source: error: LC_ALL=C patch -t -F 0 -N -p1 -u -V never -E -b -B .pc/model_icd/ --reject-file=- < debian/patches/model_icd subprocess returned exit status 1
dpkg-buildpackage: error: dpkg-source --before-build . subprocess returned exit status 2

Coisas que tentei:

Primeiro, eu simplesmente modifiquei meu patch para usar terminações de linha no estilo dos, mas o quilt remove isso e eu obtenho o mesmo resultado

$ unix2dos debian/patches/model_icd
$ dos2unix -i debian/patches/model_icd CONFIG/model_config_file.txt
      29       0       0  no_bom    text    debian/patches/model_icd
    5000       0       0  no_bom    text    CONFIG/model_config_file.txt
$ dpkg-buildpackage
...
dpkg-source: info: applying model_icd
(Stripping trailing CRs from patch; use --binary to disable.)
patching file CONFIG/model_config_file.txt
Hunk #1 FAILED at 1638 (different line endings).
Hunk #2 FAILED at 4997 (different line endings).
2 out of 2 hunks FAILED
...

Se eu testar quiltdiretamente, posso fazê-lo funcionar com a --binaryopção:

$ quilt push -a --binary
Applying patch model_icd
patching file CONFIG/model_config_file.txt

Now at patch model_icd

Para que isso funcione de forma mais automática, tentei definir QUILT_PATCH_OPTS=:

$ QUILT_PATCH_OPTS="--binary" quilt push -a
Applying patch model_icd
patching file CONFIG/model_config_file.txt

Now at patch model_icd

Então, tentei definir isso em debian/rules:

export QUILT_PATCH_OPTS="--binary"
%:
        dh $@

Mas isso não é usado por dpkg-sourcequem usa patchdiretamente, nãoquilt

Em seguida, tentei enganá-lo definindo esse sinalizador no patches/seriesarquivo. dpkg-source(1)recomenda contra isso, o que sugere que isso pode ser possível.

# debian/patches/series
model_icd --binary

Mas isso ainda não funciona.

Tentei procurar source/optionsalgo e li o guia do mantenedor , mas não vi isso abordado em lugar nenhum.

debian
  • 1 respostas
  • 25 Views
Martin Hope
Stewart
Asked: 2025-03-25 18:34:48 +0800 CST

Suporte a VNC no wayland (debian trixie)

  • 7

Estou planejando migrar para o Debian 13.

Atualmente, uso um dispositivo com tela sensível ao toque no Gnome no Xorg (não no Wayland) porque confio no VNC (especificamente no x11vnc) para monitorar sessões de área de trabalho remota.

Infelizmente, as telas sensíveis ao toque parecem estar com problemas no último mutter (gerenciador de janelas) com Xorg. Como esse problema afeta o Ubuntu 24.04 LTS e já tem 10 meses, não espero que seja corrigido em breve. Portanto, preciso migrar para o Wayland.

No entanto, x11vncnão funciona no Wayland. Tentei alguns outros: tigervnc-scraping-server, wayvnc, mas não consigo me conectar a nenhum deles.

Acho que minha melhor aposta é gnome-remote-desktopque anuncie suporte a VNC, mas parece ter sido criado com o VNC desabilitado. Posso dizer isso porque grdctlsó mostra opções para RDP:

$ grdctl --help
Usage: grdctl [OPTIONS...] COMMAND [SUBCOMMAND]
Comamnds: 
  rdp
    set-port
    enable
    disable 
    ...

Options: 
  --headless
  ...

Como posso fazer o VNC funcionar com o Wayland?

gnome
  • 1 respostas
  • 61 Views
Martin Hope
Stewart
Asked: 2025-03-14 23:06:40 +0800 CST

dlopen() falha após a transição do Debian trixie libc: "Não é possível habilitar a pilha executável"

  • 10

Estou executando o mesmo binário de 32 bits, de terceiros e de código fechado desde 2018. Esta semana, em trixie/testingservidores Debian (possivelmente devido a uma libc6transição?), o programa começou a travar na inicialização. Infelizmente, não consigo fazer com que o fornecedor original o recompile para mim.

A única dica que tenho são estas linhas impressas no stdout:

Start of process LocalCtrl...
SL - error in dlopen(libDSS_Operator.so):
LocalCtrl initialization failed...

Ou preciso fazer isso funcionar ou preciso me comprometer a dar suporte ao Deb12 para sempre.

Qual é a melhor maneira de solucionar/consertar isso?

Posso reproduzir isso em um ambiente mais estéril com este programa de exemplo:

#include <stdio.h>
#include <dlfcn.h>

int main() {
    void* so = dlopen(
        "/opt/<package>/Cots/OPERATOR/libDSS_Operator.so", 
        RTLD_NOW
    );

    if (so == NULL) {
        printf("dlopen() failed: %s\n", dlerror());
        return 1;
    } 
    printf("Success\n");
    dlclose(so);
    return 0;
}

Dei uma olhada em ldd, strace, LD_DEBUG=libs, e readelf.

Em uma máquina Deb11, onde o processo está funcionando bem, obtenho:

$ dpkg --print-foreign-architectures
i386

$ sudo apt install gcc-multilib

$ gcc main.c -m32 -ldl

$ file a.out
a.out: ELF 32-bit LSB pie executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, BuildID[sha1]=eabedb331eafcdef4e2f839f71df7fc7330069d2, for GNU/Linux 3.2.0, not stripped

$ ./a.out
Success

$ ldd /opt/<package>/Cots/OPERATOR/libDSS_Operator.so
    linux-gate.so.1 (0xf7f25000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7d1b000)
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7c17000)
    /lib/ld-linux.so.2 (0xf7f27000)

$ file /opt/<pacakge>/Cots/OPERATOR/libDSS_Operator.so
/opt/<package>/Cots/OPERATOR/libDSS_Operator.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped

$ strace ./a.out
execve("./a.out", ["./a.out"], 0x7ffeb7d8e5b0 /* 22 vars */) = 0
[ Process PID=13616 runs in 32 bit mode. ]
brk(NULL)                               = 0x5851f000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7f78000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=102958, ...}) = 0
mmap2(NULL, 102958, PROT_READ, MAP_PRIVATE, 3, 0) = 0xf7f5e000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/i386-linux-gnu/libdl.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0000\21\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=17924, ...}) = 0
mmap2(NULL, 20596, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xf7f58000
mmap2(0xf7f59000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0xf7f59000
mmap2(0xf7f5b000, 4096, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0xf7f5b000
mmap2(0xf7f5c000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0xf7f5c000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/i386-linux-gnu/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\200\260\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1987668, ...}) = 0
mmap2(NULL, 1996648, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xf7d70000
mprotect(0xf7d89000, 1871872, PROT_NONE) = 0
mmap2(0xf7d89000, 1392640, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x19000) = 0xf7d89000
mmap2(0xf7edd000, 475136, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16d000) = 0xf7edd000
mmap2(0xf7f52000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e1000) = 0xf7f52000
mmap2(0xf7f55000, 10088, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xf7f55000
close(3)                                = 0
set_thread_area({entry_number=-1, base_addr=0xf7f794c0, limit=0x0fffff, seg_32bit=1, contents=0, read_exec_only=0, limit_in_pages=1, seg_not_present=0, useable=1}) = 0 (entry_number=12)
mprotect(0xf7f52000, 8192, PROT_READ)   = 0
mprotect(0xf7f5c000, 4096, PROT_READ)   = 0
mprotect(0x56648000, 4096, PROT_READ)   = 0
mprotect(0xf7faa000, 4096, PROT_READ)   = 0
munmap(0xf7f5e000, 102958)              = 0
brk(NULL)                               = 0x5851f000
brk(0x58540000)                         = 0x58540000
brk(0x58541000)                         = 0x58541000
openat(AT_FDCWD, "/opt/<package>/Cots/OPERATOR/libDSS_Operator.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0X\6\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=4398, ...}) = 0
mmap2(NULL, 6844, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xf7f76000
mmap2(0xf7f77000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0xf7f77000
mprotect(0xf7faa000, 2636, PROT_READ|PROT_WRITE) = 0
mprotect(0xf7faa000, 2636, PROT_READ)   = 0
mprotect(0xffa54000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC|PROT_GROWSDOWN) = 0
close(3)                                = 0
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=102958, ...}) = 0
mmap2(NULL, 102958, PROT_READ, MAP_PRIVATE, 3, 0) = 0xf7d56000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/i386-linux-gnu/libm.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\220\241\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=1058344, ...}) = 0
mmap2(NULL, 1060976, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xf7c52000
mmap2(0xf7c5c000, 790528, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xa000) = 0xf7c5c000
mmap2(0xf7d1d000, 225280, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xcb000) = 0xf7d1d000
mmap2(0xf7d54000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x101000) = 0xf7d54000
close(3)                                = 0
mprotect(0xf7d54000, 4096, PROT_READ)   = 0
mprotect(0xf7f76000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC) = 0
mprotect(0xf7f76000, 4096, PROT_READ|PROT_EXEC) = 0
munmap(0xf7d56000, 102958)              = 0
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0x4), ...}) = 0
write(1, "Success\n", 8Success
)                = 8
munmap(0xf7f76000, 6844)                = 0
munmap(0xf7c52000, 1060976)             = 0
exit_group(0)                           = ?
+++ exited with 0 +++


$ LD_DEBUG=libs ./a.out
     13617: find library=libdl.so.2 [0]; searching
     13617:  search cache=/etc/ld.so.cache
     13617:   trying file=/lib/i386-linux-gnu/libdl.so.2
     13617: 
     13617: find library=libc.so.6 [0]; searching
     13617:  search cache=/etc/ld.so.cache
     13617:   trying file=/lib/i386-linux-gnu/libc.so.6
     13617: 
     13617: 
     13617: calling init: /lib/i386-linux-gnu/libc.so.6
     13617: 
     13617: 
     13617: calling init: /lib/i386-linux-gnu/libdl.so.2
     13617: 
     13617: 
     13617: initialize program: ./a.out
     13617: 
     13617: 
     13617: transferring control: ./a.out
     13617: 
     13617: find library=libm.so.6 [0]; searching
     13617:  search cache=/etc/ld.so.cache
     13617:   trying file=/lib/i386-linux-gnu/libm.so.6
     13617: 
     13617: 
     13617: calling init: /lib/i386-linux-gnu/libm.so.6
     13617: 
Success
     13617: 
     13617: calling fini: /opt/<package>/Cots/OPERATOR/libDSS_Operator.so [0]
     13617: 
     13617: 
     13617: calling fini: /lib/i386-linux-gnu/libm.so.6 [0]
     13617: 
     13617: 
     13617: calling fini: ./a.out [0]
     13617: 
     13617: 
     13617: calling fini: /lib/i386-linux-gnu/libdl.so.2 [0]
     13617: 

Nos servidores Deb13, onde estou enfrentando o problema, as saídas são muito mais curtas:

$ dpkg --print-foreign-architectures
i386

$ sudo apt install gcc-multilib

$ gcc main.c -m32 -ldl

$ file a.out
a.out: ELF 32-bit LSB pie executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, BuildID[sha1]=ab5677099dd8d392861f817ee098264a76a16792, for GNU/Linux 3.2.0, not stripped

$ ./a.out 
dlopen() failed: /opt/<package>/Cots/OPERATOR/libDSS_Operator.so: cannot enable executable stack as shared object requires: Invalid argument

$ ldd /opt/<package>/Cots/OPERATOR/libDSS_Operator.so 
    linux-gate.so.1 (0xf7ed4000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7c70000)
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7b53000)
    /lib/ld-linux.so.2 (0xf7ed6000)

$ file /opt/<pacakge>/Cots/OPERATOR/libDSS_Operator.so
.../libDSS_Operator.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped

$ strace ./a.out
execve("./a.out", ["./a.out"], 0x7ffccb5bca20 /* 24 vars */) = 0
[ Process PID=8276 runs in 32 bit mode. ]
brk(NULL)                               = 0x57fac000
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7f4a000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=122402, ...}) = 0
mmap2(NULL, 122402, PROT_READ, MAP_PRIVATE, 3, 0) = 0xf7f2c000
close(3)                                = 0
openat(AT_FDCWD, "/lib/i386-linux-gnu/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\0O\2\0004\0\0\0"..., 512) = 512
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0755, stx_size=2315004, ...}) = 0
mmap2(NULL, 2349360, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xf7cee000
mmap2(0xf7d11000, 1609728, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x23000) = 0xf7d11000
mmap2(0xf7e9a000, 544768, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1ac000) = 0xf7e9a000
mmap2(0xf7f1f000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x231000) = 0xf7f1f000
mmap2(0xf7f22000, 39216, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xf7f22000
close(3)                                = 0
set_thread_area({entry_number=-1, base_addr=0xf7f4b500, limit=0x0fffff, seg_32bit=1, contents=0, read_exec_only=0, limit_in_pages=1, seg_not_present=0, useable=1}) = 0 (entry_number=12)
set_tid_address(0xf7f4b568)             = 8276
set_robust_list(0xf7f4b56c, 12)         = 0
rseq(0xf7f4b480, 0x20, 0, 0x53053053)   = 0
mprotect(0xf7f1f000, 8192, PROT_READ)   = 0
mprotect(0x56575000, 4096, PROT_READ)   = 0
mprotect(0xf7f86000, 8192, PROT_READ)   = 0
ugetrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
munmap(0xf7f2c000, 122402)              = 0
getrandom("\x81\x4a\xa4\xb7", 4, GRND_NONBLOCK) = 4
brk(NULL)                               = 0x57fac000
brk(0x57fcd000)                         = 0x57fcd000
brk(0x57fce000)                         = 0x57fce000
openat(AT_FDCWD, "/opt/<package>/Cots/OPERATOR/libDSS_Operator.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0X\6\0\0004\0\0\0"..., 512) = 512
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=4398, ...}) = 0
mmap2(NULL, 6844, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xf7f48000
mmap2(0xf7f49000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0xf7f49000
close(3)                                = 0
munmap(0xf7f48000, 6844)                = 0
statx(1, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFCHR|0620, stx_size=0, ...}) = 0
write(1, "dlopen() failed: /opt/..."..., 153dlopen() failed: /opt/<package>/Cots/OPERATOR/libDSS_Operator.so: cannot enable executable stack as shared object requires: Invalid argument
) = 153
exit_group(1)                           = ?
+++ exited with 1 +++

$ LD_DEBUG=libs ./a.out
      8277: find library=libc.so.6 [0]; searching
      8277:  search cache=/etc/ld.so.cache
      8277:   trying file=/lib/i386-linux-gnu/libc.so.6
      8277: 
      8277: 
      8277: calling init: /lib/ld-linux.so.2
      8277: 
      8277: 
      8277: calling init: /lib/i386-linux-gnu/libc.so.6
      8277: 
      8277: 
      8277: initialize program: ./a.out
      8277: 
      8277: 
      8277: transferring control: ./a.out
      8277: 
dlopen() failed: /opt/<package>/Cots/OPERATOR/libDSS_Operator.so: cannot enable executable stack as shared object requires: Invalid argument
      8277: 
      8277: calling fini:  [0]
      8277: 
      8277: 
      8277: calling fini: /lib/i386-linux-gnu/libc.so.6 [0]
      8277: 
      8277: 
      8277: calling fini: /lib/ld-linux.so.2 [0]
      8277:

O patchelf --print-needed, objdump -p, o readelf -ada biblioteca em ambas as máquinas é quase idêntico e surpreendentemente sucinto. Eu fiz um diffe a única diferença entre a saída deb11 e deb13 foi que readelfas entradas LOCAL da tabela de símbolos de têm apenas uma coluna "Nome" preenchida em deb13. Isso pode não ser muito interessante. Aqui está a saída deb13:

$ patchelf --print-needed /opt/<package>/Cots/OPERATOR/libDSS_Operator.so
libc.so.6
libm.so.6

$ objdump -p /opt/<package>/Cots/OPERATOR/libDSS_Operator.so

/opt/<package>/Cots/OPERATOR/libDSS_Operator.so:     file format elf32-i386

Program Header:
    LOAD off    0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12
         filesz 0x000009e0 memsz 0x000009e0 flags r-x
    LOAD off    0x000009e0 vaddr 0x000019e0 paddr 0x000019e0 align 2**12
         filesz 0x000000dc memsz 0x000000dc flags rw-
 DYNAMIC off    0x00000a2c vaddr 0x00001a2c paddr 0x00001a2c align 2**2
         filesz 0x00000090 memsz 0x00000090 flags rw-

Dynamic Section:
  NEEDED               libc.so.6
  NEEDED               libm.so.6
  HASH                 0x00000094
  STRTAB               0x0000034c
  SYMTAB               0x0000015c
  STRSZ                0x00000121
  SYMENT               0x00000010
  REL                  0x00000470
  RELSZ                0x000001e8
  RELENT               0x00000008
  TEXTREL              0x00000000
  RELCOUNT             0x0000003c




$ readelf -a /opt/<package>/Cots/OPERATOR/libDSS_Operator.so 
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           Intel 80386
  Version:                           0x1
  Entry point address:               0x658
  Start of program headers:          52 (bytes into file)
  Start of section headers:          2940 (bytes into file)
  Flags:                             0x0
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         3
  Size of section headers:           40 (bytes)
  Number of section headers:         17
  Section header string table index: 14

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .hash             HASH            00000094 000094 0000c8 04   A  2   0  4
  [ 2] .dynsym           DYNSYM          0000015c 00015c 0001f0 10   A  3  14  4
  [ 3] .dynstr           STRTAB          0000034c 00034c 000121 00   A  0   0  1
  [ 4] .rel.dyn          REL             00000470 000470 0001e8 08   A  2   0  4
  [ 5] .text             PROGBITS        00000658 000658 000244 00  AX  0   0  4
  [ 6] .rodata           PROGBITS        000008a0 0008a0 000140 00   A  0   0 16
  [ 7] .data             PROGBITS        000019e0 0009e0 000040 00  WA  0   0 32
  [ 8] .got              PROGBITS        00001a20 000a20 00000c 04  WA  0   0  4
  [ 9] .dynamic          DYNAMIC         00001a2c 000a2c 000090 08  WA  3   0  4
  [10] .sbss             PROGBITS        00001abc 000abc 000000 00   W  0   0  1
  [11] .bss              NOBITS          00001abc 000abc 000000 00  WA  0   0  4
  [12] .comment          PROGBITS        00000000 000abc 000036 00      0   0  1
  [13] .note             NOTE            00000000 000af2 000014 00      0   0  1
  [14] .shstrtab         STRTAB          00000000 000b06 000076 00      0   0  1
  [15] .symtab           SYMTAB          00000000 000e24 000240 10     16  19  4
  [16] .strtab           STRTAB          00000000 001064 0000ca 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
  L (link order), O (extra OS processing required), G (group), T (TLS),
  C (compressed), x (unknown), o (OS specific), E (exclude),
  D (mbind), p (processor specific)

There are no section groups in this file.

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x000000 0x00000000 0x00000000 0x009e0 0x009e0 R E 0x1000
  LOAD           0x0009e0 0x000019e0 0x000019e0 0x000dc 0x000dc RW  0x1000
  DYNAMIC        0x000a2c 0x00001a2c 0x00001a2c 0x00090 0x00090 RW  0x4

 Section to Segment mapping:
  Segment Sections...
   00     .hash .dynsym .dynstr .rel.dyn .text .rodata 
   01     .data .got .dynamic 
   02     .dynamic 

Dynamic section at offset 0xa2c contains 13 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x00000001 (NEEDED)                     Shared library: [libm.so.6]
 0x00000004 (HASH)                       0x94
 0x00000005 (STRTAB)                     0x34c
 0x00000006 (SYMTAB)                     0x15c
 0x0000000a (STRSZ)                      289 (bytes)
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000011 (REL)                        0x470
 0x00000012 (RELSZ)                      488 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x00000016 (TEXTREL)                    0x0
 0x6ffffffa (RELCOUNT)                   60
 0x00000000 (NULL)                       0x0

Relocation section '.rel.dyn' at offset 0x470 contains 61 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
0000068f  00000008 R_386_RELATIVE   
0000069f  00000008 R_386_RELATIVE   
000006cb  00000008 R_386_RELATIVE   
000006db  00000008 R_386_RELATIVE   
000006f6  00000008 R_386_RELATIVE   
00000736  00000008 R_386_RELATIVE   
00000772  00000008 R_386_RELATIVE   
000007a7  00000008 R_386_RELATIVE   
000007b7  00000008 R_386_RELATIVE   
000007e3  00000008 R_386_RELATIVE   
000007f3  00000008 R_386_RELATIVE   
0000080e  00000008 R_386_RELATIVE   
0000084e  00000008 R_386_RELATIVE   
0000088a  00000008 R_386_RELATIVE   
000008a0  00000008 R_386_RELATIVE   
000008a4  00000008 R_386_RELATIVE   
000008a8  00000008 R_386_RELATIVE   
000008ac  00000008 R_386_RELATIVE   
000008b0  00000008 R_386_RELATIVE   
000008b4  00000008 R_386_RELATIVE   
000008c0  00000008 R_386_RELATIVE   
000008c4  00000008 R_386_RELATIVE   
000008c8  00000008 R_386_RELATIVE   
000008cc  00000008 R_386_RELATIVE   
000008d0  00000008 R_386_RELATIVE   
000008d4  00000008 R_386_RELATIVE   
000008e0  00000008 R_386_RELATIVE   
000008e4  00000008 R_386_RELATIVE   
000008e8  00000008 R_386_RELATIVE   
000008ec  00000008 R_386_RELATIVE   
000008f0  00000008 R_386_RELATIVE   
000008f4  00000008 R_386_RELATIVE   
00000900  00000008 R_386_RELATIVE   
00000904  00000008 R_386_RELATIVE   
00000908  00000008 R_386_RELATIVE   
0000090c  00000008 R_386_RELATIVE   
00000910  00000008 R_386_RELATIVE   
00000914  00000008 R_386_RELATIVE   
00000920  00000008 R_386_RELATIVE   
00000924  00000008 R_386_RELATIVE   
00000928  00000008 R_386_RELATIVE   
0000092c  00000008 R_386_RELATIVE   
00000930  00000008 R_386_RELATIVE   
00000934  00000008 R_386_RELATIVE   
00000940  00000008 R_386_RELATIVE   
00000944  00000008 R_386_RELATIVE   
00000948  00000008 R_386_RELATIVE   
0000094c  00000008 R_386_RELATIVE   
00000950  00000008 R_386_RELATIVE   
00000954  00000008 R_386_RELATIVE   
000019e0  00000008 R_386_RELATIVE   
000019e4  00000008 R_386_RELATIVE   
000019e8  00000008 R_386_RELATIVE   
000019ec  00000008 R_386_RELATIVE   
000019f0  00000008 R_386_RELATIVE   
000019f4  00000008 R_386_RELATIVE   
000019f8  00000008 R_386_RELATIVE   
000019fc  00000008 R_386_RELATIVE   
00001a00  00000008 R_386_RELATIVE   
00001a04  00000008 R_386_RELATIVE   
00000665  00000f01 R_386_32          000019e0   listOperators
No processor specific unwind information to decode

Symbol table '.dynsym' contains 31 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 00000094     0 SECTION LOCAL  DEFAULT    1 .hash
     2: 0000015c     0 SECTION LOCAL  DEFAULT    2 .dynsym
     3: 0000034c     0 SECTION LOCAL  DEFAULT    3 .dynstr
     4: 00000470     0 SECTION LOCAL  DEFAULT    4 .rel.dyn
     5: 00000658     0 SECTION LOCAL  DEFAULT    5 .text
     6: 000008a0     0 SECTION LOCAL  DEFAULT    6 .rodata
     7: 000019e0     0 SECTION LOCAL  DEFAULT    7 .data
     8: 00001a20     0 SECTION LOCAL  DEFAULT    8 .got
     9: 00001a2c     0 SECTION LOCAL  DEFAULT    9 .dynamic
    10: 00001abc     0 SECTION LOCAL  DEFAULT   10 .sbss
    11: 00001abc     0 SECTION LOCAL  DEFAULT   11 .bss
    12: 00000000     0 SECTION LOCAL  DEFAULT   12 .comment
    13: 00000000     0 SECTION LOCAL  DEFAULT   13 .note
    14: 000007fc    61 FUNC    GLOBAL DEFAULT    5 op_inv_rev
    15: 000019e0    40 OBJECT  GLOBAL DEFAULT    7 listOperators
    16: 00001a2c     0 OBJECT  GLOBAL DEFAULT  ABS _DYNAMIC
    17: 000007c0    59 FUNC    GLOBAL DEFAULT    5 op10_rev
    18: 00000658    19 FUNC    GLOBAL DEFAULT    5 getListOperator
    19: 0000083c    57 FUNC    GLOBAL DEFAULT    5 op_inv2_rev
    20: 000006e4    61 FUNC    GLOBAL DEFAULT    5 op_inv
    21: 00000784    59 FUNC    GLOBAL DEFAULT    5 op3_rev
    22: 00001abc     0 OBJECT  GLOBAL DEFAULT  ABS __bss_start
    23: 00000724    57 FUNC    GLOBAL DEFAULT    5 op_inv2
    24: 00000760    35 FUNC    GLOBAL DEFAULT    5 op_refresh
    25: 000006a8    59 FUNC    GLOBAL DEFAULT    5 op10
    26: 0000066c    59 FUNC    GLOBAL DEFAULT    5 op3
    27: 00000878    35 FUNC    GLOBAL DEFAULT    5 op_refresh_rev
    28: 00001abc     0 OBJECT  GLOBAL DEFAULT  ABS _edata
    29: 00001a20     0 OBJECT  GLOBAL DEFAULT  ABS _GLOBAL_OFFSET_TABLE_
    30: 00001abc     0 OBJECT  GLOBAL DEFAULT  ABS _end

Symbol table '.symtab' contains 36 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 00000094     0 SECTION LOCAL  DEFAULT    1 .hash
     2: 0000015c     0 SECTION LOCAL  DEFAULT    2 .dynsym
     3: 0000034c     0 SECTION LOCAL  DEFAULT    3 .dynstr
     4: 00000470     0 SECTION LOCAL  DEFAULT    4 .rel.dyn
     5: 00000658     0 SECTION LOCAL  DEFAULT    5 .text
     6: 000008a0     0 SECTION LOCAL  DEFAULT    6 .rodata
     7: 000019e0     0 SECTION LOCAL  DEFAULT    7 .data
     8: 00001a20     0 SECTION LOCAL  DEFAULT    8 .got
     9: 00001a2c     0 SECTION LOCAL  DEFAULT    9 .dynamic
    10: 00001abc     0 SECTION LOCAL  DEFAULT   10 .sbss
    11: 00001abc     0 SECTION LOCAL  DEFAULT   11 .bss
    12: 00000000     0 SECTION LOCAL  DEFAULT   12 .comment
    13: 00000000     0 SECTION LOCAL  DEFAULT   13 .note
    14: 00000000     0 SECTION LOCAL  DEFAULT   14 .shstrtab
    15: 00000000     0 SECTION LOCAL  DEFAULT   15 .symtab
    16: 00000000     0 SECTION LOCAL  DEFAULT   16 .strtab
    17: 00000000     0 FILE    LOCAL  DEFAULT  ABS operator.c
    18: 00000658     0 NOTYPE  LOCAL  DEFAULT    5 gcc2_compiled.
    19: 000007fc    61 FUNC    GLOBAL DEFAULT    5 op_inv_rev
    20: 000019e0    40 OBJECT  GLOBAL DEFAULT    7 listOperators
    21: 00001a2c     0 OBJECT  GLOBAL DEFAULT  ABS _DYNAMIC
    22: 000007c0    59 FUNC    GLOBAL DEFAULT    5 op10_rev
    23: 00000658    19 FUNC    GLOBAL DEFAULT    5 getListOperator
    24: 0000083c    57 FUNC    GLOBAL DEFAULT    5 op_inv2_rev
    25: 000006e4    61 FUNC    GLOBAL DEFAULT    5 op_inv
    26: 00000784    59 FUNC    GLOBAL DEFAULT    5 op3_rev
    27: 00001abc     0 OBJECT  GLOBAL DEFAULT  ABS __bss_start
    28: 00000724    57 FUNC    GLOBAL DEFAULT    5 op_inv2
    29: 00000760    35 FUNC    GLOBAL DEFAULT    5 op_refresh
    30: 000006a8    59 FUNC    GLOBAL DEFAULT    5 op10
    31: 0000066c    59 FUNC    GLOBAL DEFAULT    5 op3
    32: 00000878    35 FUNC    GLOBAL DEFAULT    5 op_refresh_rev
    33: 00001abc     0 OBJECT  GLOBAL DEFAULT  ABS _edata
    34: 00001a20     0 OBJECT  GLOBAL DEFAULT  ABS _GLOBAL_OFFSET_TABLE_
    35: 00001abc     0 OBJECT  GLOBAL DEFAULT  ABS _end

Histogram for bucket list length (total of 17 buckets):
 Length  Number     % of total  Coverage
      0  7          ( 41.2%)
      1  4          ( 23.5%)     23.5%
      2  5          ( 29.4%)     82.4%
      3  1          (  5.9%)    100.0%

No version information found in this file.

Displaying notes found in: .note
  Owner                Data size    Description
  01.01                0x00000000   NT_VERSION (version)

Reduzi um pouco a verbosidade patchelf --remove-rpathpara remover pesquisas desnecessárias, mas não houve nenhuma alteração em nenhuma das máquinas.

dynamic-linking
  • 1 respostas
  • 297 Views
Martin Hope
Stewart
Asked: 2025-03-04 19:20:35 +0800 CST

O resultado oom-kill do systemd reflete um "sinal impuro" ou um "código de saída impuro"?

  • 6

Um serviço meu morreu recentemente devido a oom-kill.

$ systemctl status my-server.service
● my-server.service - "General purposes load-independent HTTP server"
     Loaded: loaded (/lib/systemd/system/my-server.service; enabled; vendor preset: enabled)
     Active: failed (Result: oom-kill) since Thu 2025-02-27 12:47:44 CST; 17h ago
    Process: 636 ExecStart=/usr/bin/my-server --listen-http :13668 --threads 10 (code=exited, status=0/SUCCESS)
   Main PID: 636 (code=exited, status=0/SUCCESS)
        CPU: 52min 57.893s

Feb 27 12:47:44 ios systemd[1]: my-server.service: A process of this unit has been killed by the OOM killer.
Feb 27 12:47:44 ios my-server[636]: Received signal to stop (15). Stopping...
Feb 27 12:47:44 ios systemd[1]: my-server.service: Failed with result 'oom-kill'.
Feb 27 12:47:44 ios systemd[1]: my-server.service: Consumed 52min 57.893s CPU time.

man systemd.execdiz $SERVICE_RESULTque está definido para oom-killquando "Um processo de serviço foi encerrado pelo assassino de falta de memória (OOM)".

Este foi um vazamento de memória em um processo filho de longa duração de /usr/bin/my-server. Quando isso acontece, eu gostaria de Restart=o serviço.

A questão:

Isso $SERVICE_RESULT=oom-killaciona um código de saída impuro ou um sinal impuro?

Gostaria de limitar Restart=o máximo possível. Assim, gostaria de escolher a primeira condição que atende aos oom-killcritérios da lista abaixo:

  • Restart=on-abortpode ser usado se for um sinal impuro.
  • Restart=on-abormalpode ser usado para o caso acima, ou se acionar a causa de tempo limite ou causa de watchdog (provavelmente não aplicável).
  • Restart=on-failurefunciona para todos os casos acima, além de um código de saída impuro.
  • Restart=alwaysteoricamente cobre tudo

De man systemd.service:

Table 2. Exit causes and the effect of the Restart= settings
┌──────────────────────┬────┬────────┬────────────┬────────────┬─────────────┬──────────┬─────────────┐
│Restart settings/Exit │ no │ always │ on-success │ on-failure │ on-abnormal │ on-abort │ on-watchdog │
│causes                │    │        │            │            │             │          │             │
├──────────────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
│Clean exit code or    │    │ X      │ X          │            │             │          │             │
│signal                │    │        │            │            │             │          │             │
├──────────────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
│Unclean exit code     │    │ X      │            │ X          │             │          │             │
├──────────────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
│Unclean signal        │    │ X      │            │ X          │ X           │ X        │             │
├──────────────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
│Timeout               │    │ X      │            │ X          │ X           │          │             │
├──────────────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
│Watchdog              │    │ X      │            │ X          │ X           │          │ X           │
└──────────────────────┴────┴────────┴────────────┴────────────┴─────────────┴──────────┴─────────────┘
systemd
  • 1 respostas
  • 27 Views
Martin Hope
Stewart
Asked: 2025-02-17 21:40:11 +0800 CST

ffmpeg divide o fluxo para vários leitores locais de latência zero

  • 6

Estou usando o ffmpeg para ler de uma placa de captura de quatro entradas e gerar 3 fluxos simultâneos:

  • Sobreposição HDMI1+2 -> rtsp://localhost:5545/hud1
  • Sobreposição HDMI1+3 -> rtsp://localhost:5545/hud2
  • Somente HDMI1 -> rtsp://localhost:5545/vis

insira a descrição da imagem aqui

Este comando de entrada 1+2 levou algum tempo, mas funciona muito bem.

SOURCE1=(-f decklink -i 'DeckLink Quad HDMI Recorder (1)')
SOURCE2=(-f decklink -i 'DeckLink Quad HDMI Recorder (2)')

# Scale inputs, and transpose black pixels to alpha on the overlay
FILTER=(-filter_complex "
  [0:v]scale=960:540[base];
  [1:v]scale=540:540,colorkey=black:0.1:0.1[overlay];
  [base][overlay]overlay=(W-w)/2:(H-h)/2
")

ENCODING_OPTIONS=(
  -c:v libx264  # x264 codec
  -preset fast  # Balances latency, quality, bandwidth
  -crf 18       # 18 = visually lossless. That's good enough
  -an           # Strip out audio
) 

STREAMING_OPTIONS=(
  -b:v 5000k      # Target 5000 kbps bitrate
  -maxrate 5500k  # Should be a little higher than target to allow catchup
  -bufsize 4000k  # Bigger buffer is better for stability but reduces latency
  -r30            # Don't need 60fps, 
  -tune zerolatency
)

SINK=(-f rtsp rtsp://localhost:5545/hud1)

ffmpeg \
  "${SOURCE1[@]}" \
  "${SOURCE2[@]}" \
  "${FILTER[@]}" \
  "${ENCODING_OPTIONS[@]}" \
  "${STREAMING_OPTIONS[@]}" \
  "${SINK[@]}"

O problema:

O driver não permitirá que duas instâncias ffmpeg ouçam o mesmo canal. Se eu estiver executando HDMI1+2 e, em seguida, tentar transmitir somente HDMI1, obtenho:

Error opening input: Input/output error
Error opening input file DeckLink Quad HDMI Recorder (1)

Tentativa 1: faça um loopback do RTSP:

FUNCIONA se eu executar "Input 1 only" primeiro, depois usar para executar e . No entanto , com minha configuração, cada salto RTSP adiciona ~2s de latência. Isso significa que o Input 1 fica atrás da sobreposição em ~2s.SOURCE1=(-i rtsp://localhost/base)Input 1+2Input 1+3

insira a descrição da imagem aqui

Tentativa 2: /dev/shm

Tentei gerar "Input 1 only" para SINK=(-f shm /dev/shm/base), esperando ler isso dos fluxos Input1+2 e Input1+3. Eu esperava que manter isso local eliminaria a latência.

Requested output format 'shm' is not known.

insira a descrição da imagem aqui

Tentativa 3: unix://

Eu tentei soquetes de domínio unix definindo o SINK=(-f mpegts -listen 1 unix:/run/user/1000/base.socket)com a intenção de usar SOURCE1=(-i unix:/run/user/1000/base.socket), mas acabei com :

Unable to choose an output format for 'unix:/run/user/1000/base.socket'; use a standard extension for the filename or specify the format manually.

Então tentei usar uma extensão diferente:

SINK=(-f mpegts -listen 1 unix:/run/user/1000/base.mkv)

Mas quando tento ler com Input1+2, obtenho:

Could not find codec parameters for stream 1 ...: unspecified frame size
...
Output file does not contain any stream

Tentativa nº 4: Tudo em um:

insira a descrição da imagem aqui

Sinto que essa é provavelmente a solução, mas não está bem lá. Tentei usar o split=3filtro e -mapo recurso para fazer tudo em uma instância ffmpeg, mas a resolução da imagem base quando há uma sobreposição é muito, muito pior. Não tenho certeza se minhas opções de streaming são por stream ou talvez compartilhadas entre todos os três streams.

VISUAL_SOURCE=(-f decklink -i 'DeckLink Quad HDMI Recorder (1)' )
HUD1_SOURCE=(  -f decklink -i 'DeckLink Quad HDMI Recorder (2)' )
HUD2_SOURCE=(  -f decklink -i 'DeckLink Quad HDMI Recorder (3)' )

FILTER_PAIR=(-filter_complex "
    [0:v]scale=960:540,split=3[vis0][vis1][vis2];
    [1:v]scale=540:540,colorkey=black:0.1:0.1[hud1];
    [2:v]scale=540:540,colorkey=black:0.1:0.1[hud2];
    [vis1][hud1]overlay=(W-w)/2:(H-h)/2[hud1overlay];
    [vis2][hud2]overlay=(W-w)/2:(H-h)/2[hud2overlay]
")

ENCODING_OPTIONS=(
  -c:v libx264
  -preset fast
  -crf 18
  -an
)

STREAMING_OPTIONS=(
  -b:v 5000k
  -maxrate 5500k   
  -bufsize 4000k   
  -r 30            
  -tune zerolatency
  -xerror          
)

SINK1=(-map '[vis0]'        -f rtsp rtsp://localhost:5545/vis)
SINK2=(-map '[hud1overlay]' -f rtsp rtsp://localhost:5545/hud1)
SINK3=(-map '[hud2overlay]' -f rtsp rtsp://localhost:5545/hud2)

ffmpeg \
  "${VISUAL_SOURCE[@]}" \
  "${HUD1_SOURCE[@]}" \
  "${HUD2_SOURCE[@]}" \
  "${FILTER_PAIR[@]}" \
  "${ENCODING_OPTIONS[@]}" \
  "${STREAMING_OPTIONS[@]}" \
  "${SINK1[@]}" \
  "${SINK2[@]}" \
  "${SINK3[@]}"

A primeira saída rtsp://.../base(a FONTE1 bruta) parece ótima (semelhante à minha tentativa original com apenas 2 entradas e uma saída), mas rtsp://.../hud1( rtsp://.../hud2FONTE 2/3 sobre FONTE 1) tem uma resolução terrível.

ffmpeg
  • 1 respostas
  • 15 Views
Martin Hope
Stewart
Asked: 2025-02-14 16:16:02 +0800 CST

`gnome-tweaks`: Para onde foi a opção de segundos na barra superior?

  • 5

O Debian 11 traz o gnome-tweaks 3.34 que tem um menu de barra "Top Bar". Eu particularmente confio na opção "Seconds". Essa atualização regular da tela me ajuda a ter confiança de que uma conexão VNC ainda não foi desconectada.

ajustes do gnome 3.34

Estou atualizando a frota para o Debian 13 que vem com o gnome-tweaks 46.1. Percebi que não há um menu "Top Bar".

ajustes do gnome 46.1

Isso foi movido para algum lugar? Estou tentando encontrar algo nas notas de lançamento do upstream , mas o único lançamento no gitlab tem 7 anos.

gnome
  • 1 respostas
  • 12 Views
Martin Hope
Stewart
Asked: 2024-12-19 15:54:46 +0800 CST

Terminais: Pesquisando a saída do comando anterior

  • 4

Às vezes, se eu git checkout, ou mesmo make, acabo com alguma saída inesperada que me faz perguntar:

Espera, o quê? Vamos ver isso de novo.

Minhas opções geralmente são:

  1. Movo minha mão para o mouse e começo a rolar no terminal.
    • Para comandos como dpkg-buildpackageesse, que falham devido a um cmakeerro de configuração, eles imprimem uma quantidade enorme de dados de depuração após o erro, então você REALMENTE tem que rolar muito para trás.
  2. Execute o comando novamente através de | more.
    • mas isso não funciona bem para comandos que alteram seu estado local, como git checkout.
    • é menos útil para comandos que demoram muito para serem concluídos.

Existe um terminal que facilita a navegação pela saída de comandos anteriores?

terminal
  • 3 respostas
  • 51 Views
Martin Hope
Stewart
Asked: 2024-08-08 17:39:10 +0800 CST

complete/compgen falha ao sugerir quando as opções contêm ':' (dois pontos)

  • 6

Não consigo completeoferecer sugestões completas quando as opções ${COMPREPLY[@]}contêm um :caractere. Em vez disso, oferece apenas o prefixo comum a todas as sugestões.

Aqui está um exemplo que funciona bem:

_foo()
{
  local cur=${COMP_WORDS[$COMP_CWORD]}
  COMPREPLY=( $(compgen -W "bart baze" -- "$cur" ) )
}
complete -F _foo foo

E aqui está como é usado (nunca pressiono Enter, apenas TABonde indicado)

$ foo <tab>
$ foo ba       <-- Autocompletes common prefix, good

$ foo ba<tab>
bart baze      <-- Suggests options, good

$ foo bar<tab>
$ foo bart     <-- Autocompletes the only option, good

Mas se eu acrescentar algo com a :, like http://, ele não fornecerá sugestões completas (apenas o prefixo comum a todas as opções):

$ _foo()
{
  local cur=${COMP_WORDS[$COMP_CWORD]}
  COMPREPLY=( $(compgen -W "h:bart h:baze" -- "$cur" ) )
}
$ complete -F _foo foo
$ foo <tab>
$ foo h:ba         <-- Autocompletes common prefix, good

$ foo h:ba<tab>
$ foo h:ba         <-- No effect

O manual sugere algo sobre -Icomo trabalhar com delimitadores, mas complete -I -F _foo foonão muda nada.


Se eu inspecionar mais profundamente, parece que é como complete -Finterpreta ${COMPREPLY[@]}. compgenparece estar COMPREPLYbem.

$ COMPREPLY=( $(compgen -W "h:bart h:baze" -- h) )
$ for i in "${COMPREPLY[@]}"; do echo "$i"; done
h:bart
h:baze
bash
  • 1 respostas
  • 28 Views
Martin Hope
Stewart
Asked: 2024-05-28 23:40:33 +0800 CST

getopt com vários `--`

  • 5

Eu tenho um script com este uso:

myscript [options] positional-args... -- [fwd-params]

Como [options]pode ter variantes longas ou curtas, gosto de usar arquivos getopt. Mas estou tendo problemas.

Eu uso getoptassim:

args=$(getopt -o a:,b --long alpha:,gamma -- "$@")
eval set -- "$args"
while : ; do 
  case "$1" in
    -a | --alpha) a="$2" ; shift 2 ;; 
    -b          ) b=true ; shift   ;;
    --gamma     ) g=true ; shift   ;;
    -- )          shift  ; break   ;; 
  esac
done

positionals=()
while [ $# -gt 0 ] ; do
  case "$1" in
    *  ) positionals+=("$1"); shift ;;
    -- ) shift ; break ;;
  esac
done

# What-ever is left in "$@" needs to be forwarded to another program

backend "$@"

Isso funciona muito bem se eu não tiver nenhum [fwd-params]:

$ getopt -o a:,b -- -a 1 -b pos1 pos2
 -a '1' -b -- 'pos1' 'pos2'
            ^-- getopt adds this to help me find 
                the end-of-options/start-of-positionals

Mas desmorona se o usuário definir algum arquivo [fwd-params]. Aqui está minha saída desejada:

$ getopt -o a:,b -- -a 1 -b pos1 pos2 -- fwd1
 -a '1' -b -- 'pos1' 'pos2' '--' 'fwd1'
                              ^
                              \-   I'll use this to delimit 
                                   the positional arguments 
                                   from the forwarding ones.

E aqui está o que eu realmente entendo. A intenção do usuário --foi filtrada.

$ getopt -o a:,b -- -a 1 -b pos1 pos2 -- fwd1
 -a '1' -b -- 'pos1' 'pos2' 'fwd1'

Qual é a melhor maneira de delimitar meus argumentos posicionais dos de encaminhamento?

bash
  • 1 respostas
  • 33 Views
Martin Hope
Stewart
Asked: 2024-05-10 18:11:32 +0800 CST

Configurando PS1 com configuração em todo o site

  • 10

Tive problemas com pessoas fazendo login em alguns servidores via ssh e esquecendo que um terminal específico não é mais local. Hoje alguém tentou desligar seu laptop sudo shutdown -h nowe acidentalmente derrubou um servidor.

Eu gostaria de mudar a cor do bash PS1nesses servidores quando estiver logado via ssh. Eu controlo esses servidores através de um pacote debian que envio para eles.

Qual é a melhor maneira de implementar um padrão PS1 em todo o site?


A resposta óbvia é criar um arquivo /etc/profile.d/sshcolourscom este conteúdo para deixar o user@host roxo:

if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ] ; then
    PS1='\[\033[01;35m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
fi

bashirá ler isso via /etc/profile(quais fontes /etc/profile.d/*). No entanto, mais tarde ele lerá ~/.bashrco que provavelmente será substituído PS1com base $TERMno definido em /etc/skel/.bashrc.

Existe alguma maneira de arquivar sourcemeu site em todo o site ~/.bashrcsem tocar ~/.bashrce sem forçar minha equipe a adotar uma mudança no lado do cliente?


Aqui estão algumas ideias ruins:

  1. Depois de definir $PS1, ~/.bashrccondicionalmente fontes /usr/share/bash-completion/completions/*, para que eu pudesse colocar meu arquivo lá. Mas alguns testes me mostraram que a condição não foi atendida ou /usr/share/bash-completion/bash_completionreverteu o ambiente.

  2. Em postinsteu poderia anexar uma linha para fornecer meu arquivo ao arquivo ~/.bashrc. Isso parece ilegal e problemático:

for h in /home/*; do
    if [ ! grep -q profile_amendments "$h/.bashrc" ] ; then
        echo ". /etc/profile_amendments" >> "$h/.bashrc"
    fi
done
bash
  • 3 respostas
  • 165 Views
Martin Hope
Stewart
Asked: 2024-04-19 18:23:40 +0800 CST

Como manter monitorações confiáveis ​​em arquivos editados com o inotify?

  • 6

Gostaria de monitorar um arquivo com inotifye acionar algum código quando alguém altera o conteúdo ( IN_MODIFYou IN_CLOSE_WRITE), mas estou tendo problemas onde inotifypara de retornar eventos quando os usuários editam o arquivo com sua ferramenta favorita. O arquivo deve ser simples (linha única, sem espaços, no máximo 20 caracteres). Prefiro não restringir seu uso, mas não sei como lidar com diferentes situações.

Estou usando inotifye estes são os eventos que recebo quando vários aplicativos editam o arquivo:

Ação inotify Eventos
touch file IN_OPEN
echo "data" > file IN_MODIFY, IN_OPEN, IN_ACCESS, entãoIN_CLOSE_NOWRITE
nano file(em aberto) IN_OPEN
nano file(sobre ^O) IN_MODIFY, IN_CLOSE_WRITE, IN_OPEN,IN_ACCESS
vim file(em aberto) IN_OPEN,IN_CLOSE_NOWRITE
vim file(sobre :w) IN_MOVE_SELF, IN_ATTRIB, então os eventos param de vir deste arquivo
gedit file(em aberto) IN_OPEN, IN_CLOSE_NOWRITE,IN_ACCESS
gedit file(ao salvar) IN_OPEN, IN_CLOSE_WRITE, IN_ATTRIB, então os eventos param de vir deste arquivo
mv newfile file IN_ATTRIB, então os eventos param de vir deste arquivo

A certa altura, pensei ter visto gedito gatilho também disparar IN_DELETE_SELFantes de ficar em silêncio.

No caso em que um usuário usa vime gedit, paro de receber inotifyeventos depois que o usuário termina as edições. Como devo lidar com isso?

A única coisa que vejo em comum é o IN_ATTRIBevento. Suspeito que quando receber o IN_ATTRIBevento, devo fazer inotify_rm_watch()isso wde depois recriar um novo inotify_add_watch()com base no mesmo caminho. Mas essa é a abordagem correta?

Outra opção poderia ser observar o diretório pai. O nome do arquivo afetado está incluído no arquivo inotify_event::namee, portanto, eu poderia filtrar o arquivo de interesse e acionar qualquer um IN_MODIFYou IN_CLOSE_WRITEonde namecorresponda ao meu arquivo de interesse.

inotify
  • 2 respostas
  • 47 Views
Martin Hope
Stewart
Asked: 2024-03-08 19:17:18 +0800 CST

bash-completion: Adicionando uma sugestão citada com um espaço

  • 5

Estou adicionando o bash-completion a uma ferramenta existente.

Depois que alguém passar a -sbandeira, gostaria de oferecer várias opções de conclusão do bash:

  • Closed
  • Feedback
  • "In Progress"
  • New
  • Rejected
  • Resolved

O espaço "In Progress"está causando um problema.

#!/usr/bin/env bash
_remote-redmine()
{
    local cur

    COMPREPLY=()
    cur=${COMP_WORDS[$COMP_CWORD]}

    case "${COMP_WORDS[($COMP_CWORD-1)]}" in
        -s)
            s_opts=( "New" "In Progress" "Resolved" "Feedback" "Closed" "Rejected" )
            COMPREPLY=( $( compgen -W "${s_opts[*]}" -- "$cur") )
            ;;
    esac
    return 0
}
complete -F _remote-redmine remote-redmine

Quando executo a ferramenta, recebo:

$ remote-redmine -s <tab><tab>
Closed    Feedback  In        New       Progress  Rejected  Resolved

Mas eu gostaria de obter:

$ remote-redmine -s <tab><tab>
Closed    Feedback  "In Progress"       New       Rejected  Resolved

ou

$ remote-redmine -s <tab><tab>
Closed    Feedback  In\ Progress        New       Rejected  Resolved

Coisas que tentei:

  • s_opts=( ... "In\ Progress" ... ): Sem diferença

  • s_opts( ... "In\\ Progress" ...): Sem diferença

  • s_opts( ... "In\\\ Progress" ...): Duas opções são In\eProgress

  • s_opts( ... "\"In Progress\"" ...): Sem diferença

  • compgen -o nospace ...: Sem diferença

  • compgen -o noquote ...: Sem diferença

  • Pelo menos compgenpode colocar In Progressuma linha, mas isso não se traduz emcomplete

    $ compgen -W 'New "In Progress"'
    New
    In Progress
    
  • Escapar de aspas extras ajuda compgen, mas isso não se traduz em complete:

    $ compgen -W 'New "\"In Progress\""'
    New
    "In Progress"
    
  • Escapar do espaço três vezes ajuda, mas ainda não se traduz em complete:

    $ compgen -W 'New In\\\ Progress'
    New
    In\ Progress
    
  • Achei que escapar do espaço sete vezes seria promissor porque resolveria completealguns deles, mas isso também não ajudou:

    $ compgen -W 'New In\\\\\\\ Progress'
    New
    In\\\ Progress
    ...
    $ remote-redmine -s <tab><tab>
    ...   In\\\  New  Progress ...
    
  • Ignorar compgenfuncionará, mas perco o preenchimento automático em guias únicas e a filtragem em guias duplas

    COMPREPLY=( ... 'In\ Progress' ... )
    COMPREPLY=( ,,, '"In Progress"' ... )
    
bash
  • 1 respostas
  • 19 Views
Martin Hope
Stewart
Asked: 2024-02-13 15:46:07 +0800 CST

TEMPO de expiração do gpg?

  • 7

Eu tenho uma licença com a qual estou assinando:

gpg --default-sig-expire "2024-02-14" --sign licence

Isto resulta em:

$ gpg --verify licence.gpg
gpg: Signature made Tue 13 Feb 2024 08:18:39 AM CET
gpg:                using RSA key 1234567890ABCDEF1234567890ABCDEF
gpg:                issuer "[email protected]"
gpg: Good signature from "Stewart <[email protected]>" [ultimate]
gpg: Signature expires Wed 14 Feb 2024 12:00:00 PM CET

Esse 12:00:00 PM CETé o meu problema. Geralmente vou almoçar nesse horário. Prefiro não receber ligações sobre sistemas off-line enquanto estou almoçando. É possível especificar o horário? Prefiro que expire em 13:00:00 PM CET.


--ask-sig-expiresolicita apenas o número de dias/semanas/anos:

$ gpg --ask-sig-expire --sign licence
Please specify how long the signature should be valid.
         0 = signature does not expire
      <n>  = signature expires in n days
      <n>w = signature expires in n weeks
      <n>m = signature expires in n months
      <n>y = signature expires in n years
Signature is valid for? (0) 

ISO 8601 não parece compatível:

$ gpg --default-sig-expore "2024-02-14T13:00:00+02:00" --sign licence
gpg: '2024-02-14T13:00:00+02:00' is not a valid signature expiration

A man systemd.timeespecificação não parece suportada

$ gpg --default-sig-expire "2024-02-14 13:00:00" --sign licence
gpg: '2024-02-14 13:00:00' is not a valid signature expiration

A página de manual também não sugere que um momento seja possível:

--default-sig-expire
       The default expiration time to use for signature expiration. Valid values 
       are "0" for no expiration, a number followed by the letter d (for days), 
       w (for weeks), m (for months), or  y (for years) (for example "2m" for two 
       months, or "5y" for five years), or an absolute date in the form 
       YYYY-MM-DD. Defaults to "0".

A única solução que encontrei foi alterar o fuso horário do meu sistema para o próximo fuso horário a oeste de mim, assinar e definir o fuso horário do meu sistema de volta ao meu horário original.

$ sudo mv /etc/localtime{,.backup} 
$ sudo ln -s /usr/share/zoneinfo/Europe/London /etc/localtime
$ gpg --default-sig-expire "2024-02-14" --sign licence
$ sudo mv /etc/localtime{.backup,}
$ gpg --verify licence.gpg
gpg: Signature made Tue 13 Feb 2024 08:18:39 AM CET
gpg:                using RSA key 1234567890ABCDEF1234567890ABCDEF
gpg:                issuer "[email protected]"
gpg: Good signature from "Stewart <[email protected]>" [ultimate]
gpg: Signature expires Wed 14 Feb 2024 01:00:05 PM CET
gpg
  • 1 respostas
  • 41 Views
Martin Hope
Stewart
Asked: 2023-11-20 21:06:37 +0800 CST

Implantando certificados de CA privados em dispositivos Debian

  • 7

Temos uma autoridade de certificação (CA) privada que é usada apenas em sites da nossa intranet.

Posso obter o certificado facilmente:

openssl s_client -showcerts -connect atlas.sim.local:8443 </dev/null 2>/dev/null|openssl x509 -outform PEM >atlas.crt

Gostaria que meus dispositivos Debian confiassem automaticamente nesta autoridade de certificação. Eu tenho aptum repositório privado e todos os meus dispositivos Debian possuem pacotes deste repositório instalados. Portanto, gostaria que este *.crtarquivo fosse implantado neste pacote.

O pacote efetivamente fará isso:

install -Dm644 atlas.crt /usr/share/ca-certificates/sim.local/atlas.crt

Mas como faço para regenerar os certificados ca depois que esse arquivo for implantado? Estou procurando um arquivo para implantar ou uma linha em que possa executar postinst.


Meu primeiro pensamento foi simplesmente:

/usr/sbin/update-ca-certificates

mas man update-ca-certificatesdiz:

update-ca-certificatesé um programa que atualiza o diretório /etc/ssl/certspara conter certificados SSL e gera ca-certificates.crt...

Ele lê o arquivo /etc/ca-certificates.conf. Cada linha fornece um nome de caminho de um certificado CA no /usr/share/ca-certificatesqual deve ser confiável.

Para que isso funcione, preciso garantir sim.local/atlas.crtque esteja no formato /etc/ca-certificates.conf. Infelizmente não há nada /etc/ca-certificates.conf.d/que me permita inserir outro arquivo com esse conteúdo.


Se eu ler /etc/ca-certificates.conf, diz:

# This file lists certificates that you wish to use or to ignore to be
# installed in /etc/ssl/certs.
# update-ca-certificates(8) will update /etc/ssl/certs by reading this file.
#
# This is autogenerated by dpkg-reconfigure ca-certificates.

Portanto, eu poderia tentar:

dpkg-reconfigure ca-certificates

Mas isso faz com que apareça uma caixa de diálogo interativa com meu certificado desmarcado por padrão. Prefiro que não seja interativo.


Este é o meu atual postinst. mas não tenho certeza se é a solução certa. Existe uma maneira certa de fazer isso?

#!/bin/bash

set -e

case "$1" in
  configure)

    if [ -e /etc/ca-certificates.conf ] && 
      ! grep -q sim.local/atlas.crt /etc/ca-certificates.conf; then

        printf "%s\n" sim.local/atlas.crt >> /etc/ca-certificates.conf;
        /usr/sbin/update-ca-certificates;
    fi
  ;;
esac
debian
  • 3 respostas
  • 112 Views
Martin Hope
Stewart
Asked: 2023-03-02 20:34:04 +0800 CST

Impedir que solicitações para 127.0.0.1 sejam encaminhadas para http_proxy

  • 8

Eu tenho isso na minha máquina:

$ cat /etc/profile.d/proxy.sh 
export http_proxy=http://192.168.1.30:3128
export https_proxy=https://192.168.1.30:3128

Isso funciona muito bem, até que preciso usar uma interface HTTP com um aplicativo no localhost.

$ wget localhost
--2023-03-02 06:54:52--  http://localhost/
Connecting to 192.168.1.30:3128... connected.
Proxy request sent, awaiting response... 503 Service Unavailable
2023-03-02 06:54:52 ERROR 503: Service Unavailable.

$ wget 127.0.0.1
--2023-03-02 06:55:20--  http://127.0.0.1/
Connecting to 192.168.1.30:3128... connected.
Proxy request sent, awaiting response... 403 Forbidden
2023-03-02 06:55:20 ERROR 403: Forbidden.

Existe uma maneira de evitar localhostque as 127.0.0.1solicitações sejam encaminhadas para o proxy?


Detalhes:

Esta máquina não está conectada diretamente à internet. Não possui gateway ou rota padrão. Mas está em uma LAN com uma máquina proxy (192.168.1.30) que possui um servidor proxy instalado (porta 3128) e possui uma conexão com a Internet.

$ ip addr
1: lo: ...
    inet 127.0.0.1/8 scope host lo
2: eno1: ...
    altname enp24s0f0
    inet 192.168.1.100/24 brd 192.168.1.255 scope global eno1

$ ip route
192.168.1.0/24 dev eno1 proto kernel scope link src 192.168.1.100

$ cat /etc/hosts
127.0.0.1   localhost

$ cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eno1
iface eno1 inet static
    address 192.168.1.100
    netmask 255.255.255.0
networking
  • 1 respostas
  • 436 Views
Martin Hope
Stewart
Asked: 2021-12-22 05:37:04 +0800 CST

update-alternatives com serviços

  • 1

Eu gostaria de instalar um serviço de um *.debpacote, vinculá-lo usando update-alternatives. Em seguida, habilite/inicie o link simbólico. Existem alguns exemplos disso no arquivo debian existente? Se não, como alguém faria isso?

Estou fazendo isso porque quero poder implantar várias versões do meu software na mesma máquina e usar update-alternativespara escolher qual delas é executada.

Arquivos de controle típicos podem ser assim para algo que usa update-alternativese depende do debhelper para serviços:

# myapp99.postinst
update-alternatives --install \
    /lib/systemd/system/myapp.service myapp \
    /lib/systemd/system/myapp99.service 99

#DEBHELPER#
# myapp99.prerm
update-alternatives --remove myapp lib/systemd/system/myapp99.service

#DEBHELPER#

Mas o problema aqui é operar #DEBHELPER#depois que eu já o tiver feito.myapp.servicepostrmupdate-alternatives --remove

Eu poderia mover meu update-alternatives --removepara depois #DEBHELPER#no postrm, mas ainda teria um problema em que a limpeza de um pacote antigo não utilizado pararia/desativaria myapp.service. Tenho certeza de que há outras coisas que não estou considerando também.

Existem pacotes no arquivo debian existente que fazem o que estou tentando fazer?

Estou quase pensando em fazer isso sem debhelper: Verificar se o link existe antes da instalação e habilitar se for novo. Verificando se o link existe após a limpeza, e parando/desabilitando/mascarando somente se este foi o último fornecedor daquele serviço. Se esse é o único caminho a seguir, tudo bem... Eu prefiro não reinventar a roda e introduzir bugs.

debian
  • 1 respostas
  • 42 Views
Martin Hope
Stewart
Asked: 2021-11-15 07:47:13 +0800 CST

Como obter o endereço IP do MAC

  • 1

Estou tentando me conectar a uma câmera wifi externa de segunda mão. Ele tem um slot ethernet e um adesivo com o endereço MAC, mas nenhuma outra marca ou modelo/número de série.

Estou tentando encontrar seu endereço IP.

Meu plano atual é conectar um cabo ethernet diretamente entre minha máquina e esta câmera e, em seguida, digitalizar todos os intervalos IPv4 privados reservados com nmap:

ip addr add 10.0.0.1/8 dev eno2
ip addr add 172.16.0.1/12 dev eno2
ip addr add 192.168.0.1/16 dev eno2

nmap -sn 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8

Mas isso pode levar muito tempo (acho que cerca de 74 horas) e não posso ter certeza de que este dispositivo não está usando IPv6. Existe uma solução melhor?

nmap
  • 2 respostas
  • 136 Views
Martin Hope
Stewart
Asked: 2019-06-28 06:37:08 +0800 CST

Observando as propriedades do sd-bus

  • 3

Eu tenho uma GUI onde ActiveStatemostro vários serviços do systemd.

Em 10Hz, uso a API sd-bus para consultar cada serviço assim:

sd_bus* bus;
sd_bus_error err = SD_BUS_ERROR_NULL;
char* msg = 0;

sd_bus_default_system(&bus);

sd_bus_get_property_string(bus,
    "org.freedesktop.systemd1",
    "/org/freedesktop/systemd1/unit/foo_2eservice",
    "org.freedesktop.systemd1.Unit",
    "ActiveState",
    &err,
    &msg);

Meu problema é que quando executo esse código, /sbin/initou /lib/systemd/systemd-logindconsome cerca de 50% da CPU. A criação de perfil do código mostra uma enorme quantidade de tempo consumido pelo sd_bus_get_property_string. Preciso reduzir o número de vezes que chamo essa função.

A introspecção da interface d-bus é interessante:

busctl introspect \
    org.freedesktop.systemd1 \
    /org/freedesktop/systemd1/unit/foo_2eservice \
    org.freedesktop.system1.Unit

NAME                             TYPE      SIGNATURE RESULT/VALUE   FLAGS
.Kill                            method    si        -     -
.Ref                             method    -         -     -
.Reload                          method    s         o     -
.ReloadOrRestart                 method    s         o     -
.ReloadOrTryRestart              method    s         o     -
.ResetFailed                     method    -         -     -
.Restart                         method    s         o     -
.SetProperties                   method    ba(sv)    -     -
.Start                           method    s         o     -
.Stop                            method    s         o     -
.TryRestart                      method    s         o     -
.Unref                           method    -         -     -
.ActiveEnterTimestamp            property  t         0     emits-change
.ActiveEnterTimestampMonotonic   property  t         0     emits-change
.ActiveExitTimestamp             property  t         0     emits-change
.ActiveExitTimestampMonotonic    property  t         0     emits-change
.ActiveState                     property  s         "inactive"   emits-change
...

Isso me diz que a propriedade ActiveState emite uma alteração .

Como posso obter um descritor de arquivo ou tocar no loop de eventos para receber essa alteração?


A especificação D-Bus sugere que o systemd emitirá um org.freedesktop.DBus.Properties.PropertiesChangedsinal quando as propriedades mudarem. Acho que preciso descobrir como assinar esse sinal.

systemd d-bus
  • 2 respostas
  • 3000 Views
Martin Hope
Stewart
Asked: 2019-06-21 02:01:04 +0800 CST

Não é possível excluir um arquivo em um grupo

  • 0

Estou tentando limpar alguns arquivos de memória compartilhada de lixo deixados por um serviço após a falha. O serviço é executado como um usuário do sistema e um grupo específico. Sou membro desse grupo, mas não consigo excluir a memória compartilhada.

$ ls -la /dev/shm
drwxrwxrwt  2 root   root        600 Jun 20 11:18 .
drwxr-xr-x 22 root   root       3680 Jun 19 12:43 ..
-rw-rw-rw-  1 simbot simusers 500032 Jun 20 10:35 Sim_SharedMem_SLM__data_0

$ groups | grep simusers -q && echo member || echo not member
member

$ rm -f /dev/shm/Sim_SharedMem_SLM__data_0 
rm: cannot remove '/dev/shm/Sim_SharedMem_SLM__data_0': Operation not permitted

Não tenho problemas para excluir os arquivos como root. Também não tenho problemas para excluir o arquivo se sou eu quem executa (e trava) o processo (sou o usuário que possui os arquivos).

Reprodução

Acho que a maneira mais fácil de exibir o problema é executar o processo como eu e alterar alguns dos arquivos de lixo como se fossem de propriedade do outro usuário.

$ /usr/local/bin/badProcess
^C

$ ls -la /dev/shm
drwxrwxrwt  2 root root     640 Jun 20 11:31 .
drwxr-xr-x 22 root root    3680 Jun 19 12:43 ..
-rw-rw-rw-  1 stew stew  500032 Jun 20 11:31 Sim_SharedMem_SLM__data_0
-rw-rw-rw-  1 stew stew  500032 Jun 20 11:31 Sim_SharedMem_SLM__data_1
-rw-rw-rw-  1 stew stew  500032 Jun 20 11:31 Sim_SharedMem_SLM__data_2
-rw-rw-rw-  1 stew stew  500032 Jun 20 11:31 Sim_SharedMem_SLM__data_3

$ sudo chown simbot          Sim_SharedMem_SLM__data_1
$ sudo chown       :simusers Sim_SharedMem_SLM__data_2
$ sudo chown simbot:simusers Sim_SharedMem_SLM__data_3

$ ls -la /dev/shm
drwxrwxrwt  2 root   root         640 Jun 20 11:31 .
drwxr-xr-x 22 root   root        3680 Jun 19 12:43 ..
-rw-rw-rw-  1 stew   stew      500032 Jun 20 11:31 Sim_SharedMem_SLM__data_0
-rw-rw-rw-  1 simbot stew      500032 Jun 20 11:31 Sim_SharedMem_SLM__data_1
-rw-rw-rw-  1 stew   simusers  500032 Jun 20 11:31 Sim_SharedMem_SLM__data_2
-rw-rw-rw-  1 simbot simusers  500032 Jun 20 11:31 Sim_SharedMem_SLM__data_3

$ rm /dev/shm/*
rm: cannot remove 'Sim_SharedMem_SLM__data_1`': Operation not permitted
rm: cannot remove 'Sim_SharedMem_SLM__data_3`': Operation not permitted

lsattr

Algumas soluções sugerem verificar os atributos +a ou +i com lsattr.

$ lsattr Sim_SharedMem_SLM__data_0
lsattr: Inappropriate ioctl for device While reading flags on Sim_SharedMem_SLM__data_0

Isso acontece porque esses atributos não são suportados pelo tmpfs (que é esse diretório)

$ mount | grep /dev/shm
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)

ACLs

Dei uma olhada na ACL para ver se havia algo engraçado com o diretório pai ou o próprio arquivo. Não vejo que não aprendemos com ls Eu tenho permissões de gravação no diretório pai

$ getfacl /dev/shm
getfacl: Removing leading '/' from absolute path names
# file: dev/shm
# owner: root
# group: root
# flags: --t
user::rwx
group::rwx
other::rwx

$ getfacl /dev/shm/Sim_SharedMem_SLM__data_0 
getfacl: Removing leading '/' from absolute path names
# file: dev/shm/Sim_SharedMem_SLM__data_0
# owner: simbot
# group: simusers
user::rw-
group::rw-
other::rw-
files rm
  • 1 respostas
  • 634 Views
Martin Hope
Stewart
Asked: 2019-05-21 07:05:24 +0800 CST

Empacotando componentes do CMake para Debian

  • 1

Eu tenho um único pacote fonte upstream usando cmake e gostaria de empacotá-lo como dois pacotes binários debian.

$ tree proj
proj/
├── app1.c
├── app2.c
└── CMakeLists.txt

O Upstream's CMakeLists.txtjá foi escrito com isso em mente. Eles usam o argumento COMPONENTS deinstall

$ cat proj/CMakeLists.txt
include(GnuInstallDirs)

add_executable(app1 app1.c)
install(
  TARGETS app1 
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  COMPONENT app1)

add_executable(app2 app2.c)
install(
  TARGETS app2
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  COMPONENT app2)

Para compilar/instalar localmente, é bem fácil:

$ mkdir build && cd build
$ cmake ../proj -DCMAKE_INSTALL_PREFIX=/usr/local  # Configure
$ cmake --build .                                  # Build
$ cmake -DCOMPONENT=app1 -P cmake_install.cmake    # Install app1 component
$ cmake -DCOMPONENT=app2 -P cmake_install.cmake    # Install app2 component

Mas como você construiria um debian/rulesarquivo para isso?

packaging deb
  • 1 respostas
  • 1632 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve