小编Mat*_*hid的帖子

杀死所有后代进程

我正在写一个应用程序。它能够产生各种外部进程。当应用程序关闭时,我希望它产生的任何进程都被杀死。

听起来很容易,对吧?查找我的 PID,并递归地遍历进程树,以自下而上的方式杀死所有可见的东西。

不同之处在于,这并不正常工作。在一种特定情况下,我 spawn foo,但foo只是spawn ,bar然后立即退出,继续bar运行。现在没有关于bar曾经是应用程序进程树一部分的事实的记录。因此,应用程序无法知道它应该杀死bar.

我很确定我不能成为地球上第一个尝试这样做的人。那么标准的解决方案是什么?我想我真的在寻找某种方式来“标记”一个进程,这样它产生的任何进程都将无条件地继承相同的标签。

(到目前为止,我能想到的最好的方法是以不同的用户身份运行应用程序。这样,您就可以随意终止属于该用户的所有进程。但这有各种访问权限问题......)

process kill

95
推荐指数
4
解决办法
16万
查看次数

在不同的 tty 上启动进程

在谷歌搜索了大约一个小时后,我不敢相信之前没有人真正问过这个问题......

所以我有一个在 TTY1 上运行的脚本。如何让该脚本在 TTY2 上启动一些任意程序?

  • 我找到了tty,它会告诉您您当前使用的是哪个 TTY。
  • 我发现writevt,它将一行文本写入不同的 TTY。
  • 我发现chvt,它改变了当前显示的 TTY。

我不想显示TTY2。我只希望主脚本继续正常执行,但是如果我手动切换到 TTY2,我可以与第二个程序进行交互。

bash tty

37
推荐指数
3
解决办法
6万
查看次数

从 initramfs 挂载根文件系统

这是一个常见的场景。无论出于何种原因,initramfs(OpenSUSE,以防万一)未能找到根文件系统,因此它会将您置于救援外壳中。我非常清楚需要安装什么设备。我的问题:

挂载根文件系统并继续引导顺序的正确步骤是什么?

大概这就是救援控制台的全部意义所在。然而,似乎没有人记录你是如何做到这一点的。

显然我可以在某处挂载根文件系统。但是我如何使它成为文件系统树的?现在我在那之后继续正常的启动过程吗?(我以为只要退出 shell 就可以了……但事实并非如此。)在继续之前,您究竟需要安装什么,以及如何继续?

startup boot opensuse initramfs root-filesystem

21
推荐指数
4
解决办法
5万
查看次数

使用环境变量打开 xtrace

Bash 有一个有时有用的功能,如果您打开“ -x”选项(我相信符号名称是xtrace),Bash 会在执行时输出脚本的每一行。

我知道有两种方法可以实现这种行为:

  • 在脚本本身中,说set -x
  • 在命令行上,将-x选项传递给 Bash。

有什么方法可以通过环境变量打开此选项吗?

(特别是,我自己没有调用 Bash,所以我无法向它传递任何选项,并且感兴趣的脚本位于压缩存档内,我真的不想重建它。如果我可以设置一个环境变量,它可能会被所有子进程继承......)

  • 联机帮助页说了一些关于 的内容BASHOPTS,但是当我尝试时,Bash 说这是只读的。(感谢您没有在联机帮助页中提及这一点。)

  • 同样,SHELLOPTS似乎也是只读的。

  • 您可以选择与 一起使用哪个 FDBASH_XTRACEFD。但我仍然需要首先打开跟踪。

bash environment-variables trace

17
推荐指数
1
解决办法
5760
查看次数

控制 Ctrl+C 取消哪个进程

我有一张可以启动到 Linux 并运行一个小的 Bash 脚本的 live CD。该脚本搜索并运行第二个程序(通常是编译后的 C++ 二进制文件)。

您应该能够通过按Ctrl+来中止第二个程序C。什么应该发生的是,第二个节目暂停,和bash脚本运行继续清理。什么实际发生的是主应用程序和bash脚本都终止。这是一个问题。

所以我使用trap内置命令告诉 Bash 忽略 SIGINT。现在Ctrl+C终止 C++ 应用程序,但 Bash 继续运行。伟大的。

哦,是的...有时“第二个应用程序”是另一个 Bash 脚本。在这种情况下,Ctrl+C现在什么都不做

显然我对这些东西如何工作的理解是错误的......当用户按下Ctrl+时,我如何控制哪个进程获得 SIGINT C?我想将此信号定向到一个特定的进程

bash signals

15
推荐指数
1
解决办法
7805
查看次数

在运行时更改内核参数

在尝试修复一个模糊的硬件错误时,有人建议向内核添加几个参数可能会解决该问题。

我当然可以这样做,但我想知道是否可以对正在运行的内核进行这些更改。特别是,我知道procfssysfs提供了一种对正在运行的内核进行更改的方法,但我不确定如何将内核参数名称映射到文件路径。(我还假设并非所有设置都可以在运行时更改,并且一旦系统启动,这些特定参数很可能无法配置。)

我感兴趣的具体参数是

i8042.nomux=1 i8042.reset
Run Code Online (Sandbox Code Playgroud)

我特别不确定是否可以在正在运行的系统上发出重置命令。

如果这些参数在运行时可以调整,我在哪里可以找到它们?

linux-kernel

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

关机时弹出 CD

好的,所以我有一个简单的问题:我有一张 Live CD,我希望在计算机重新启动或停止时弹出 CD。

执行/usr/bin/eject -m使 CD 弹出就好了...问题是,正如您所料,这会导致操作系统崩溃,因为它现在无法读取任何文件。所以重启永远不会发生,因为/sbin/reboot无法访问。(我尝试reboot --help > /dev/null在重新启动前立即执行,但仍有其他文件仍无法读取...)

总之,看来我需要让弹出成为最后发生的事情。所以这似乎systemd是我需要玩的小狗......但我已经浪费了我生命中的数小时戳和刺激它,无论我做什么,它在任何情况下都永远不会真正弹出CD。我不知道为什么。我尝试了十几种不同的调用方式eject,但没有任何反应。

谁能告诉我最简单的跑步方式eject?(我想之后umount.target会是明智的......)

shutdown systemd

12
推荐指数
1
解决办法
3013
查看次数

路径语法规则

我正在编写一个用于操作 Unix 路径字符串的库。既然如此,我需要了解大多数人不会担心的语法的一些晦涩的角落。

例如,作为最好的,我可以告诉大家,似乎foo/barfoo//bar都指向同一个地方。

此外,~通常代表用户的主目录,但如果它出现在路径中间呢?那会发生什么?

如果我要编写正确处理每种可能情况的代码,这些以及其他几十个晦涩的问题需要回答。有人知道解释这些东西的确切语法规则的权威参考吗?

(不幸的是,搜索诸如“Unix 路径语法”之类的术语只会出现一百万页讨论$PATH变量……哎呀,我什至在努力为这个问题找到合适的标签!)

directory filenames

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

命令“时间”独立工作但不在管道中

考虑以下:

# time sleep 1

real    0m1.001s
user    0m0.001s
sys     0m0.000s
# echo foo | time sleep 1
bash: time: command not found
Run Code Online (Sandbox Code Playgroud)

嗯……嗯?

好的,很明显,当作为管道运行时,Bash 正在以某种不同的方式搜索命令。谁能向我解释一下有什么区别?管道是否禁用外壳内置程序或其他东西?(我不认为它有......但是......我看不出这是怎么回事。)

bash pipe time

11
推荐指数
1
解决办法
838
查看次数

多行替换

我花了很长时间试图弄清楚这一点。碰巧,我不再需要这样做了;我找到了另一种方法。但为了我的理智,我还是想知道答案。

sed用一些文本替换标记非常容易。我想不通的是如何sed插入一大块文本,具有复杂的格式,例如多行、制表符等。你是怎么做到的?是sed最好的东西还是什么?

sed

9
推荐指数
1
解决办法
4193
查看次数