小编Joh*_*ith的帖子

dpkg 在 PATH 变量中找不到 ldconfig/start-stop-daemon

我试图安装已安装bsd-mailx软件包的实用程序,但是我想知道错误。

这是我得到的错误:

Preconfiguring packages ...
dpkg: warning: 'ldconfig' not found in PATH or not executable.
dpkg: warning: 'start-stop-daemon' not found in PATH or not executable.
dpkg: error: 2 expected programs not found in PATH or not executable.
Note: root's PATH should usually contain /usr/local/sbin, /usr/sbin and /sbin.
E: Sub-process /usr/bin/dpkg returned an error code (2)
Run Code Online (Sandbox Code Playgroud)

ubuntu dpkg apt mailx

56
推荐指数
3
解决办法
12万
查看次数

是否有任何 UNIX 变体可以让子进程与其父进程一起死亡?

我研究 Linux 内核行为已经有一段时间了,我一直很清楚:

当一个进程终止时,它的所有子进程都会返回给该init进程(PID 1),直到它们最终终止。

然而,最近,一个比我在内核方面更有经验的人告诉我:

当一个进程退出时,它的所有子进程也会死亡(除非你NOHUP在这种情况下使用它们返回到init)。

现在,即使我不相信这一点,我仍然编写了一个简单的程序来确保它。我知道我不应该依赖时间 ( sleep) 进行测试,因为它完全取决于进程调度,但对于这个简单的情况,我认为这已经足够了。

int main(void){
    printf("Father process spawned (%d).\n", getpid());
    sleep(5);

    if(fork() == 0){
        printf("Child process spawned (%d => %d).\n", getppid(), getpid());
        sleep(15);
        printf("Child process exiting (%d => %d).\n", getppid(), getpid());
        exit(0);
    }

    sleep(5);
    printf(stdout, "Father process exiting (%d).\n", getpid());
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

这是程序的输出,ps每次printf通话时都有相关的结果:

$ ./test &
Father process spawned (435).

$ ps -ef | grep test
myuser    435    392   tty1 …
Run Code Online (Sandbox Code Playgroud)

process fork exit init

49
推荐指数
2
解决办法
2万
查看次数

为什么使用命令替换时换行符会丢失?

我有一个名为 links.txt 的文本文件,它看起来像这样

link1
link2
link3
Run Code Online (Sandbox Code Playgroud)

我想逐行遍历这个文件并对每一行执行一个操作。我知道我可以使用 while 循环来做到这一点,但由于我正在学习,我想使用 for 循环。我实际上使用了这样的命令替换

a=$(cat links.txt)
Run Code Online (Sandbox Code Playgroud)

然后像这样使用循环

for i in $a; do ###something###;done
Run Code Online (Sandbox Code Playgroud)

我也可以做这样的事情

for i in $(cat links.txt); do ###something###; done
Run Code Online (Sandbox Code Playgroud)

现在我的问题是当我在变量 a 中替换 cat 命令输出时,link1 link2 和 link3 之间的换行符被删除并被空格替换

echo $a
Run Code Online (Sandbox Code Playgroud)

产出

链接1 链接2 链接3

然后我使用了 for 循环。当我们执行命令替换时,是否总是用空格替换新行?

问候

shell command-substitution newlines

48
推荐指数
3
解决办法
10万
查看次数

如何在 dm-crypt+LUKS 容器上设置标签?

我刚收到一个新的 USB 闪存驱动器,并在其上设置了 2 个加密分区。我使用 dm-crypt(LUKS 模式)到cryptsetup. 使用额外的非加密分区,驱动器具有以下结构:

  • /dev/sdb1,加密,隐藏标有“分区 1”的 ext4 文件系统。
  • /dev/sdb2,加密,隐藏另一个 ext4 文件系统,标记为“分区 2”。
  • /dev/sdb3,清晰可见的 ext4 文件系统,标记为“分区 3”。

因为标签附加到 ext4 文件系统,所以只要分区没有被解密,前两个就完全不可见。这意味着,与此同时,LUKS 容器没有标签。这在使用 GNOME(自动挂载)时特别烦人,在这种情况下,分区显示为“ x GB 加密”和“ y GB 加密”,直到我决定解锁它们。

这不是一个真正的阻塞问题,但它很烦人,因为我真的很喜欢我的标签,并且很想看到它们出现,即使我的分区仍然加密。

因此,有没有办法将标签附加到 dm-crypt+LUKS 容器,就像我们将标签附加到 ext4 文件系统一样?dm-crypt+LUKS 标头是否有空间,如果有,我该如何设置标签?

请注意,我不想在解密之前暴露我的 ext4 标签,这很愚蠢。我想向容器添加其他标签,这些标签可能会在 ext4 标签隐藏时出现。

partition gnome dm-crypt luks cryptsetup

17
推荐指数
2
解决办法
9727
查看次数

是否存在 ld 忽略 LD_LIBRARY_PATH 的情况?

我刚刚遇到一个ld我无法解释的小问题。假设我在我的主目录中编译了一个库并将其全部安装在~/root. 共享库文件可以在以下位置找到~/root/usr/local/lib/libmylib.so

因为~/root/usr/local/lib不在链接器的搜索路径中,所以我LD_LIBRARY_PATH像往常一样设置:

LD_LIBRARY_PATH="$HOME/root/usr/local/lib"
export LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)

并检查该库是否可用:

$ ls $LD_LIBRARY_PATH/libmylib.so
/home/me/root/usr/local/lib/libmylib.so
Run Code Online (Sandbox Code Playgroud)

现在,如果我运行:

$ ld -lmylib --verbose
Run Code Online (Sandbox Code Playgroud)

最后几行应包含以下内容:

attempt to open /home/me/root/usr/local/lib/libmylib.so succeeded
-lmylib (/home/me/root/usr/local/lib/libmylib.so)
Run Code Online (Sandbox Code Playgroud)

除了我的情况外,他们没有。ld根本不执行任何查找/home/me/root。的内容LD_LIBRARY_PATH根本不会出现在输出中,这表明ld无耻地忽略了该变量(实际上,我的目录从未出现在SEARCH_DIR输出的前面)。

但是,如果我运行:

$ ld -L $LD_LIBRARY_PATH -lmylib --verbose
Run Code Online (Sandbox Code Playgroud)

我确实得到了上述几行,一切都很顺利,这意味着库或安装路径没有任何问题。

有没有什么情况可以ld忽略LD_LIBRARY_PATH?我已经检查过env,但找不到任何其他与链接器相关的变量(RPATHLIBRARY_PATHLD_RUN_PATH,都经过测试)。除了注册一些(其他)目录之外,下面的配置/etc/ld.so.*似乎没有做任何事情。该机器运行 Scientific Linux 7.4、gcc 6.4 和 ld 2.25.1。有问题的图书馆是libxml++-3.0.

shared-library ld

6
推荐指数
1
解决办法
5631
查看次数

如何以编程方式检测用户登录?

我正在开发一个小型守护程序,当用户登录系统时需要运行一些指令(包括各种登录)。为此,我希望每当发生此登录事件时都唤醒我的程序。但是,我不希望它定期检查新用户是否到达,这意味着它不能:

  • /var/log/auth.log定期读取日志文件等。除了我必须实际解析文件这一事实之外,我还可能经常这样做(因为我的系统上登录的次数很少)。
  • 检查另一个命令的输出,例如ps, whoorw并在内部跟踪用户。使用这种方法,程序可能会错过一些登录,以防有人在我的程序对输出运行检查之前登录和注销。

因为我不想让我的程序浪费时间,所以我想过使用 I/O 事件,但是......我不太明白在哪里挂钩。我试过监视/var/run/utmp(使用inotify),但它似乎没有正确反应:当终端打开/关闭时,我的程序会收到很多事件,但当有人实际登录时(如果有的话)很少。此外,这些事件几乎无法识别,并且会从一次登录尝试变为另一次登录尝试。作为记录,这是我在运行时能够捕捉到的一些内容su user

  • 当终端打开时:(IN_OPEN文件被打开),IN_CLOSE_NOWRITE(不可写文件关闭),有时IN_ACCESS(文件被访问,使用时su -l)。
  • 何时su开始(密码提示):一些没有标识符 ( event.mask = 0) 的事件。
  • 成功登录尝试后(shell 以另一个用户身份启动):什么都没有。
  • 关闭终端时:另一组未命名的事件。

还有另一种方法可以将程序挂接到“用户登录”上吗?是否有一个文件反映了我可以使用inotify手表的用户登录信息(就像我可以使用手表/proc来检测进程创建一样)?我又看了看/proc内容,但似乎没有什么是我需要的。

旁注:我考虑在 Stack Overflow 上发布它,因为它与编程相关,但除了实现之外,我对 Linux 系统在用户登录时的“可见”反应更感兴趣(“可见”,我的意思是反应)我们可以以编程方式观察/检测/注意,而不会浪费时间)。

users login inotify

5
推荐指数
1
解决办法
4649
查看次数

每次systemd自动挂载后如何执行脚本?

我正在尝试设置一个系统,以便每次安装任何 USB 存储设备时都会执行脚本(在这种情况下,由 systemd 自动安装)。基于此处此处此处的一些参考资料,systemd 允许在安装特定设备后执行自定义脚本,但这些脚本可以是:

  • 需要特定的设备或挂载点。
  • 使用 udev,它触发过早,并保持挂载过程。
  • 使用审计或日志,这不是很令人满意。

无论如何,systemd 单元中是否有不那么具体,允许ExecStart在任何成功(自动)挂载后使用?

automounting mount systemd

5
推荐指数
1
解决办法
1754
查看次数

我可以在 tty 上激活密码反馈吗?

几周前,我决定清理键盘,结果在将几个键重新装回板上时弄乱了它们。结果,某些字符变得非常难以输入......显然我在密码中使用了其中的一些字符。

当然,我计划更换我的键盘,但与此同时,每天必须在我的 ttys 上进行 4-5 次登录尝试开始让我感到不安(我不使用桌面管理器)。

我已经通过在配置pwfeedback中进行设置来稍微缓解这个问题sudo。这使我能够在键盘跳过字符时“看到”。但是我找不到agettylogin组合的类似选项。

有没有办法激活 tty 登录提示的密码反馈?

password login keyboard agetty

4
推荐指数
1
解决办法
565
查看次数

访问 Ubuntu 上的文件时出现只读文件系统错误

我有一台 Ubuntu 机器。我远程连接到它并收到以下错误:

mkdir: cannot create directory `/testFolder': Read-only file system
Run Code Online (Sandbox Code Playgroud)

像WINDOWS一样,重新启动机器解决了这个错误。

有人可以向我解释这种行为吗。我有点惊讶。

filesystems ubuntu readonly

3
推荐指数
1
解决办法
2万
查看次数

输出中出现意外的父进程 ID

我的代码正在分叉一个进程并打印每个进程的 PID 和 PPID。我期待孩子的 PPID 与父母的 PID 相同,但事实并非如此。

我正在使用 Ubuntu 14.04。

#include <stdio.h>
#include <sys/wait.h>

int main(){
    int pid;
    pid = fork();
    if(pid==0){
        printf("\nI am the child and my parent id is %d and my id %d\n", getppid(), getpid());
    }
    else
        printf("\nI am the parent and my pid is %d and my parent id is %d\n", getpid(), getppid());

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

I am the parent and my pid is 29229 and my parent id is 27087
I am the …
Run Code Online (Sandbox Code Playgroud)

linux ubuntu system-calls fork

2
推荐指数
1
解决办法
543
查看次数