AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-272848

Stewart's questions

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

在原始文件上使用 dos 行尾应用 debian quilt 补丁

  • 6

我在一个源码包中有一个带有 DOS 风格行尾的文件*.orig.tar.xz,我需要在构建 Debian 软件包之前先给它打补丁3.0 (quilt)。我的补丁目前是 Unix 风格的行尾。

我们可以检查文件,发现补丁有 29 个 unix 风格的行尾,而源文件有 5000 个 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

构建结果:

$ 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

我尝试过的事情:

首先,我只是修改了我的补丁,使用 dos 风格的行尾,但 quilt 删除了它,我得到了相同的结果

$ 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
...

如果我直接测试quilt,我可以让它与该选项一起工作--binary:

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

Now at patch model_icd

为了让它更自动地工作,我尝试设置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

接下来,我尝试将其设置为debian/rules:

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

但这不会被直接dpkg-source使用patch,而不是quilt

接下来,我尝试通过在文件中设置此标志来欺骗它patches/series。 dpkg-source(1)建议不要这样做,这表明这是可能的。

# debian/patches/series
model_icd --binary

但这仍然不起作用。

我尝试寻找source/options一些东西,并且我一直在阅读维护者指南,但我没有在任何地方看到这方面的内容。

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

在 Wayland 上支持 VNC(debian trixie)

  • 7

我计划迁移到 Debian 13。

我目前在 Xorg(不是 wayland)上的 Gnome 上使用触摸屏设备,因为我依靠 VNC(特别是 x11vnc)来监控远程桌面会话。

遗憾的是,在最新的 Xorg 窗口管理器中,触摸屏似乎不太好用。由于这个问题影响了 Ubuntu 24.04 LTS,而且已经存在 10 个月了,我预计它不会很快得到修复。因此,我不得不迁移到 Wayland。

但是x11vnc在 Wayland 上不行。我试过其他几个:tigervnc-scraping-server、,wayvnc但都无法连接。

我认为最好的办法是gnome-remote-desktop宣传支持 VNC,但这似乎是在禁用 VNC 的情况下构建的。我之所以能判断出来,是因为grdctl只显示了 RDP 选项:

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

Options: 
  --headless
  ...

如何让 VNC 与 Wayland 协同工作?

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

Debian trixie libc 转换后 dlopen() 失败:“无法启用可执行堆栈”

  • 10

自 2018 年以来,我一直在运行相同的 32 位第三方闭源二进制文件。本周在 Debiantrixie/testing服务器上(可能是由于libc6过渡?),该程序在启动时开始崩溃。不幸的是,我无法让原始供应商为我重新编译它。

我唯一的提示是在标准输出上打印的这些行:

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

我要么让它工作起来,要么就承诺永远支持 Deb12。

排除故障/修复此问题的最佳方法是什么?

我可以使用此示例程序在更加简单的环境中重现此过程:

#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;
}

我看了一下ldd、、、和strace。LD_DEBUG=libsreadelf

在 Deb11 机器上,该过程运行正常,我得到:

$ 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: 

在遇到问题的 Deb13 服务器上,输出要短得多:

$ 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:

两台机器上的库的patchelf --print-needed、objdump -p、几乎完全相同,而且出奇地简洁。我做了一个,deb11 和 deb13 输出之间的唯一区别是的符号表的 LOCAL 条目仅在 deb13 中有一个填充的“名称”列。这可能不是很有趣。这是 deb13 输出:readelf -adiffreadelf

$ 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)

我减少了一些冗长的内容以patchelf --remove-rpath消除不必要的搜索,但两台机器上都没有变化。

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

systemd 的 oom-kill 结果是否反映“不干净的信号”或“不干净的退出代码”?

  • 6

我的一项服务最近因 而停止运行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.exec当“服务进程被内存不足(OOM)终止程序终止”时,表示$SERVICE_RESULT设置为“服务进程被内存不足(OOM)终止程序终止”。oom-kill

这是 的长期运行子进程中发生的内存泄漏/usr/bin/my-server。发生这种情况时,我希望Restart=服务能够正常运行。

问题:

是否$SERVICE_RESULT=oom-kill触发不干净的退出代码,或者不干净的信号?

我想Restart=尽可能地限制自己。因此,我想oom-kill从以下列表中选择符合条件的第一个条件:

  • Restart=on-abort如果它是一个不干净的信号,则可以使用它。
  • Restart=on-abormal可以用于上述情况,或者如果它触发超时原因,或看门狗原因(可能不适用)。
  • Restart=on-failure适用于上述所有情况,外加不干净的退出代码。
  • Restart=always理论上涵盖一切

从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 个回答
  • 27 Views
Martin Hope
Stewart
Asked: 2025-02-17 21:40:11 +0800 CST

ffmpeg 为多个本地零延迟读取器分割流

  • 6

我正在使用 ffmpeg 从四输入捕获卡读取,并输出 3 个同时的流:

  • HDMI1+2 覆盖 -> rtsp://localhost:5545/hud1
  • HDMI1+3 覆盖 -> rtsp://localhost:5545/hud2
  • 仅 HDMI1 -> rtsp://localhost:5545/vis

在此处输入图片描述

这个输入1+2命令花了一些时间,但效果很好。

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[@]}"

问题:

驱动程序不允许两个 ffmpeg 实例监听同一个频道。如果我运行 HDMI1+2,然后尝试仅传输 HDMI1,我会得到:

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

尝试 1:环回 RTSP:

如果我先运行“仅输入 1”,然后使用运行和 ,它确实可以工作。但是,在我的配置下,每次 RTSP 跳转都会增加约 2 秒的延迟。这意味着输入 1 比覆盖延迟约 2 秒。SOURCE1=(-i rtsp://localhost/base)Input 1+2Input 1+3

在此处输入图片描述

尝试 2:/dev/shm

我尝试将“仅输入 1”输出到SINK=(-f shm /dev/shm/base),希望从 Input1+2 和 Input1+3 流中读取该内容。我希望将其保留在本地可以消除延迟。

Requested output format 'shm' is not known.

在此处输入图片描述

尝试 3:unix://

SINK=(-f mpegts -listen 1 unix:/run/user/1000/base.socket)我尝试通过设置来使用unix 域套接字SOURCE1=(-i unix:/run/user/1000/base.socket),但最终得到:

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.

所以我尝试使用不同的扩展:

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

但是当我尝试用 Input1+2 读取它时,我得到:

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

尝试#4:一体化:

在此处输入图片描述

我觉得这可能是解决方案,但还不够。我尝试使用split=3过滤器和-map功能在一个 ffmpeg 实例中完成所有操作,但当基础图像上有覆盖层时,其分辨率要差得多。我不确定我的流媒体选项是每个流的还是在所有三个流之间共享的。

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[@]}"

第一个输出rtsp://.../base(原始 SOURCE1)看起来很棒(类似于我原来只有 2 个输入和一个输出的尝试),但是rtsp://.../hud1(rtsp://.../hud2SOURCE 2/3 除以 SOURCE 1)的分辨率很差。

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

`gnome-tweaks`:顶部栏秒数选项去哪儿了?

  • 5

Debian 11 附带了 gnome-tweaks 3.34,它有一个“顶部栏”菜单栏。我特别依赖“秒”选项。定期刷新屏幕有助于让我确信 VNC 连接尚未断开。

gnome-tweaks 3.34

我将 Fleet 升级到 Debian 13,其中包含 gnome-tweaks 46.1。我注意到没有“顶部栏”菜单。

gnome-tweaks 46.1

它已经移动到别处了吗?我试图在上游发行说明中查找一些内容,但 gitlab 上唯一的发行版已有 7 年历史。

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

终端:搜索上一个命令的输出

  • 4

有时如果我git checkout,甚至make,我最终会得到一些意想不到的输出,这让我问:

等一下,什么?我们再看看。

我的选择通常是:

  1. 将我的手移到鼠标上并开始在终端中滚动。
    • dpkg-buildpackage对于由于配置错误而失败的命令cmake,它们会在错误发生后打印大量的调试数据,因此您真的必须回滚很长很长的距离。
  2. 通过 重新运行命令| more。
    • 但这对于改变本地状态的命令不太适用,例如git checkout。
    • 对于需要很长时间才能完成的命令来说,它用处不大。

是否有一个终端可以轻松浏览以前命令的输出?

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

当选项包含“:”(冒号)时,complete/compgen 无法提出建议

  • 6

complete当选项中${COMPREPLY[@]}包含字符时,我无法提供完整的建议:。相反,它只提供所有建议共有的前缀。

这是一个运行良好的例子:

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

以下是它的使用方法(我从不按Enter,只TAB在指示的地方按)

$ 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

但是,如果我在前面添加一些内容:,例如http://,它就无法提供完整的建议(仅提供所有选项共有的前缀):

$ _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

该手册对-I使用分隔符提出了一些建议,但complete -I -F _foo foo并没有改变任何内容。


如果我深入检查,它似乎与如何complete -F解释有关${COMPREPLY[@]}。 compgen似乎设置得COMPREPLY很好。

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

getopt 带有几个 `--`

  • 5

我有一个具有这种用法的脚本:

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

因为[options]可以有长或短的变体,我喜欢使用getopt.但我有麻烦了。

我getopt这样使用:

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 "$@"

如果我没有的话,这非常有用[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

但如果用户定义了任何[fwd-params].这是我想要的输出:

$ 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.

这就是我实际得到的。用户的意图--已经被过滤掉了。

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

将我的位置参数与转发的位置参数区分开来的最佳方法是什么?

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

使用站点范围配置设置 PS1

  • 10

我遇到过这样的问题:人们通过 ssh 登录某些服务器,却忘记特定终端不再是本地的。今天,有人尝试使用 关闭笔记本电脑sudo shutdown -h now,并意外地关闭了服务器。

我想PS1在通过 登录时更改这些服务器上bash 的颜色ssh。我通过推送给它们的 debian 软件包来控制这些服务器。

推动全站 PS1 默认设置的最佳方式是什么?


显而易见的答案是创建一个/etc/profile.d/sshcolours包含以下内容的文件,以使 user@host 变为紫色:

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

bash/etc/profile将通过(来源)阅读该内容/etc/profile.d/*。但是,它稍后会读取~/.bashrc,这可能会PS1根据$TERM中的定义进行覆盖/etc/skel/.bashrc。

有没有什么方法可以让我在不接触并且不强迫我的团队采用客户端更改的情况source下进行站点范围的文件?~/.bashrc~/.bashrc


这里有一些不好的想法:

  1. 设置后$PS1,~/.bashrc有条件地来源/usr/share/bash-completion/completions/*,这样我就可以把我的文件放在那里。但一些测试表明,条件不满足,或者/usr/share/bash-completion/bash_completion恢复了环境。

  2. 我postinst可以附加一行将我的文件源到每个用户的~/.bashrc. 这感觉既非法又有问题:

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

如何使用 inotify 可靠地维护对已编辑文件的监视?

  • 6

我想使用 来监视文件inotify,并在有人更改内容(IN_MODIFY或)时触发一些代码,但是当用户使用他们喜欢的工具编辑文件时,IN_CLOSE_WRITE我遇到了停止返回事件的问题。inotify该文件应该很简单(单行、无空格、最多 20 个字符)。我不想限制它们的使用,但我不确定如何处理不同的情况。

我正在使用inotify这些是当各种应用程序编辑文件时我收到的事件:

行动 inotify 事件
touch file IN_OPEN
echo "data" > file IN_MODIFY,IN_OPEN,IN_ACCESS, 然后IN_CLOSE_NOWRITE
nano file(打开时) IN_OPEN
nano file(在^O) IN_MODIFY, IN_CLOSE_WRITE, IN_OPEN,IN_ACCESS
vim file(打开时) IN_OPEN,IN_CLOSE_NOWRITE
vim file(在:w) IN_MOVE_SELF, IN_ATTRIB, 然后事件停止来自该文件
gedit file(打开时) IN_OPEN, IN_CLOSE_NOWRITE,IN_ACCESS
gedit file(保存时) IN_OPEN, IN_CLOSE_WRITE, IN_ATTRIB,然后事件停止来自该文件
mv newfile file IN_ATTRIB,然后事件停止来自该文件

有一次,我以为我看到了gedit触发器,IN_DELETE_SELF然后又沉默了。

vim在用户使用and的情况下gedit,我会inotify在用户完成编辑后停止获取事件。我该如何处理这个问题?

我所看到的唯一共同点是事件IN_ATTRIB。我怀疑当我收到事件时IN_ATTRIB,我应该inotify_rm_watch()这样做,然后基于相同的路径wd重新创建一个新的。inotify_add_watch()但这是正确的方法吗?

另一种选择可能是监视父目录。受影响的文件名包含在 中inotify_event::name,因此我可以过滤感兴趣的文件,并触发任何IN_MODIFY与我感兴趣的文件匹配的IN_CLOSE_WRITE位置。name

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

bash-completion:添加带空格的引用建议

  • 5

我正在将 bash-completion 添加到现有工具中。

在有人传递-s标志后,我想提供几个关于 bash-completion 的选项:

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

里面的空间"In Progress"引起了问题。

#!/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

当我运行该工具时,我得到:

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

但我想得到:

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

或者

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

我尝试过的事情:

  • s_opts=( ... "In\ Progress" ... ): 没有不同

  • s_opts( ... "In\\ Progress" ...): 没有不同

  • s_opts( ... "In\\\ Progress" ...): 两个选项是In\和Progress

  • s_opts( ... "\"In Progress\"" ...): 没有不同

  • compgen -o nospace ...: 没有不同

  • compgen -o noquote ...: 没有不同

  • 至少compgen可以放In Progress一行,但这并不能转化为complete

    $ compgen -W 'New "In Progress"'
    New
    In Progress
    
  • 转义额外的引号有助于compgen,但这并不能转化为complete:

    $ compgen -W 'New "\"In Progress\""'
    New
    "In Progress"
    
  • 转义空格三次确实有帮助,但仍然没有帮助;不能转化为complete:

    $ compgen -W 'New In\\\ Progress'
    New
    In\ Progress
    
  • 我认为逃离该空间七次是有希望的,因为这样complete可以解决其中的一些问题,但这也没有帮助:

    $ compgen -W 'New In\\\\\\\ Progress'
    New
    In\\\ Progress
    ...
    $ remote-redmine -s <tab><tab>
    ...   In\\\  New  Progress ...
    
  • 绕过compgen会起作用,但随后我会失去单选项卡上的自动填充和双选项卡上的过滤功能

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

gpg 过期时间?

  • 7

我有一个正在签署的许可证:

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

这导致:

$ 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

这12:00:00 PM CET是我的问题。我通常那个时候去吃午饭。我不想在午餐时接到有关系统离线的电话。可以指定时间吗?我宁愿它过期于13:00:00 PM CET。


--ask-sig-expire仅提示您输入天数/周数/年数:

$ 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 似乎不受支持:

$ 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

该man systemd.time规范似乎不受支持

$ 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

手册页也没有表明可能的时间:

--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".

我找到的唯一解决方案是将系统的时区更改为我以西的下一个时区,然后签名,然后将系统的时区设置回原来的时间。

$ 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 个回答
  • 41 Views
Martin Hope
Stewart
Asked: 2023-11-20 21:06:37 +0800 CST

将私有 CA 证书部署到 debian 设备

  • 7

我们有一个私有证书颁发机构 (CA),仅在我们的 Intranet 站点上使用。

我可以轻松获得证书:

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

我希望我的 Debian 设备自动信任此证书颁发机构。我有私人apt存储库,并且我的所有 debian 设备都安装了此存储库中的软件包。因此,我希望将此*.crt文件部署到此包中。

该包将有效地做到这一点:

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

但是,部署此文件后如何重新生成 ca 证书?我正在寻找要部署的文件或可以在其中运行的行postinst。


我的第一个想法很简单:

/usr/sbin/update-ca-certificates

但man update-ca-certificates说:

update-ca-certificates是一个更新目录/etc/ssl/certs以保存 SSL 证书并生成ca-certificates.crt...的程序

它读取文件/etc/ca-certificates.conf。/usr/share/ca-certificates每行给出了应信任的CA 证书的路径名。

为此,我需要确保sim.local/atlas.crt位于/etc/ca-certificates.conf. 不幸的是,没有任何/etc/ca-certificates.conf.d/东西可以让我插入包含该内容的另一个文件。


如果我读/etc/ca-certificates.conf,它说:

# 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.

因此,我可以尝试:

dpkg-reconfigure ca-certificates

但这会导致出现一个交互式对话框,默认情况下取消选择我的证书。我宁愿这是非交互式的。


这是我目前的postinst。但我不确定这是否是正确的解决方案。有正确的方法吗?

#!/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 个回答
  • 112 Views
Martin Hope
Stewart
Asked: 2023-03-02 20:34:04 +0800 CST

防止对 127.0.0.1 的请求被转发到 http_proxy

  • 8

我的机器上有这个:

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

效果很好,直到我需要对本地主机上的应用程序使用 HTTP 接口。

$ 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.

有没有办法阻止localhost和127.0.0.1请求被转发到代理?


细节:

这台机器没有直接连接到互联网。它没有网关或默认路由。但它位于带有代理服务器 (192.168.1.30) 的 LAN 上,该代理计算机 (192.168.1.30) 安装了代理服务器(端口 3128)并具有 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 个回答
  • 436 Views
Martin Hope
Stewart
Asked: 2021-12-22 05:37:04 +0800 CST

带有服务的更新替代方案

  • 1

我想从一个*.deb包中安装一个服务,使用update-alternatives. 然后启用/启动符号链接。在现有的 debian 档案中有这样的例子吗?如果没有,人们将如何做到这一点?

我这样做是因为我希望能够在同一台机器上部署我的软件的多个版本,然后使用update-alternatives来选择运行哪个版本。

update-alternatives对于使用并依赖 debhelper 提供服务的东西,典型的控制文件可能如下所示:

# 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#

但是这里的问题是在我已经完成它之后#DEBHELPER#会继续运行。myapp.servicepostrmupdate-alternatives --remove

我可以在 postrm 中将我的update-alternatives --remove移到#DEBHELPER#after ,但我仍然会遇到一个问题,即清除旧的未使用的包将 stop/disable myapp.service。我敢肯定还有其他事情我也没有考虑。

现有的 debian 存档中是否有任何软件包可以做我想做的事情?

我几乎考虑不这样做debhelper:在安装之前检查链接是否存在,如果是新的则启用。清除后检查链接是否存在,仅当这是该服务的最后一个供应商时才停止/禁用/屏蔽。如果这是唯一的方法,那很好......我只是不想重新发明轮子并引入错误。

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

如何从 MAC 获取 IP 地址

  • 1

我正在尝试连接到二手外部 wifi 摄像头。它有一个以太网插槽和一个带有 MAC 地址但没有其他品牌或型号/序列号的标签。

我正在尝试查找它的 IP 地址。

我目前的计划是在我的机器和这台相机之间直接连接一根以太网电缆,然后使用以下命令扫描所有保留的私有 IPv4 范围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

但这可能需要很长时间(我猜大约需要 74 小时),而且我不能确定这个设备没有使用 IPv6。有更好的解决方案吗?

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

观看 sd-bus 属性

  • 3

我有一个 GUI,可以在其中显示ActiveState几个 systemd 服务。

在 10Hz 时,我使用 sd-bus api 来查询每个服务,如下所示:

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);

我的问题是,当我运行这段代码时,/sbin/init还是/lib/systemd/systemd-logind消耗了大约 50% 的 CPU。分析代码显示sd_bus_get_property_string. 我需要减少调用此函数的次数。

d-bus接口的自省很有意思:

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
...

这告诉我 ActiveState 属性发出了一个 change。

如何获取文件描述符,或点击事件循环以接收该更改?


D-Bus 规范建议 systemd 将在属性更改时发出信号org.freedesktop.DBus.Properties.PropertiesChanged。我想我需要弄清楚如何订阅该信号。

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

无法删除组中的文件

  • 0

我正在尝试清理崩溃后服务留下的一些垃圾共享内存文件。该服务以系统用户和特定组的身份运行。我是该组的成员,但无法删除共享内存。

$ 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

我以root身份删除文件没有问题。如果我是运行(并导致崩溃)进程的人(我是拥有文件的用户),我删除文件也没有问题。

复制

我认为展示问题的最简单方法是以我自己的身份运行该进程,然后更改一些垃圾文件,就好像它们归其他用户所有一样。

$ /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

一些解决方案建议使用 lsattr 检查 +a 或 +i 属性。

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

发生这种情况是因为 tmpfs 不支持这些属性(这就是这个目录)

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

ACL

我查看了 ACL,看看父目录或文件本身是否有什么有趣的地方。我没有看到我们没有从中学到ls 我对父目录有写权限

$ 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 个回答
  • 634 Views
Martin Hope
Stewart
Asked: 2019-05-21 07:05:24 +0800 CST

为 Debian 打包 CMake 组件

  • 1

我有一个使用 cmake 的上游源包,我想将它打包为两个二进制 debian 包。

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

Upstream 的CMakeLists.txt写作已经考虑到了这一点。他们使用 COMPONENTS 参数install

$ 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)

要在本地编译/安装,非常简单:

$ 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

但是您将如何为此构建debian/rules文件?

packaging deb
  • 1 个回答
  • 1632 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve