在 Ubuntu Linux 20.04 上,cat /proc/$$/sessionid
显示3
,在 openSUSE 15.5 上,显示2
。
或3
肯定2
与 中的会话 ID 值(SID)有不同的含义getsid(0)
,那么它是什么意思呢?
场景:我正在运行一堆命令,其中一些会提示“是/否”的答案。我不小心输入yes
了命令而不是对提示的响应。哎呀。现在我的外壳看起来像这样:
$ yum install -y something-important
... useful output I want to go back and refer to, perhaps multiple times
$ yes
y
y
y
y
y
y
y
y
y
y
y
... there are tens of thousands of lines... oh god, Y??
yes
在意识到发生了什么后,我成功地停止了命令,但损坏已经造成。我正处于激烈的 shell 会话中,现在我失去了向上滚动以获取相关输出的能力!显然之前的文本都还在,但它本质上是无法访问的,因为它与所有y
. 类似的东西clear
将有助于从我的屏幕上删除难看的y
洪流,但它不会帮助我回到之前的会话状态。
我怎样才能挽救这个会话以前的输出仍然有用?
我正在尝试做的事情:我正在尝试从源代码构建我自己的完整 KDE 并以我的普通用户身份运行它,而无需从系统中更改它。问题:如果不将整个系统更改为始终只运行该软件,我似乎无法运行我构建的软件。
根据我从文档第 2.5.1 节的理解,这得到了很好的支持。kdesrc-build 将安装一个登录驱动程序,以便登录管理器找到一个适当的设置来运行等离子会话,该会话运行在我的安装前缀中构建的软件。我无法开箱即用地完成这项工作——SDDM 不会看到已安装的脚本,但我可以通过将plasma.desktop
kdesrc-build 安装的文件链接到我的 /usr/share/xsession 文件夹来轻松地工作。这让 SDDM 可以看到我的会话。
不幸的是,这仍然无法运行我从源代码构建的 KDE。这样做的原因是,虽然这会从我构建的软件启动 init 序列,但启动序列(如在plasma/plasma-workspace/startkde/plasma-session/startup.cpp 及其朋友中)只会添加安装前缀对于一开始的一些命令,所以它会运行我构建的 startkde 但很快它就会恢复到 from$PATH
并且似乎没有人设置该变量。在我看来,一些环境脚本应该这样做(kde-env-master.sh 看起来是个不错的候选者)
所以我作弊,安排登录脚本设置$PATH
为包含我构建的软件的bin目录。但这还不够——我构建的二进制文件现在将尝试从系统中加载库,这些库不是他们构建的对象。init 文件中有一些引用设置$LD_LIBRARY_PATH
为包含我构建的库所在的目录,但出于安全原因$LD_LIBRARY_PATH
,经常重置(实际上,一旦 init 序列删除权限,就会发生这种情况),因此在环境脚本实际上被忽略了。
我可以设置我的 ldconfig 来查找我构建的这些库——但这是系统范围的,所以如果我这样做,使用我的发行版安装的稳定软件运行的正常会话将尝试使用我构建的库,这充其量是危险的主意。
所有这些都表明我做错了什么,但我不知道是什么。毕竟,文档说运行会话是正确的方法,kdesrc-build
安装登录驱动程序,有文件可以将我构建的前缀中内置的环境设置为正确的目录,所有这些似乎都很好地集成了但是当我尝试这样做我发现一个又一个问题,所以我只能假设我没有做对。
我应该如何设置一个运行我定制的 KDE 的会话,而不影响我的发行版安装的常规会话?
注意:在 Debian 测试和 kdesrc-build 20.06 上运行它
命令“logname”给了我登录用户的名字,不管后续的“su”调用。例如,在当前的铸币厂中,命令“logname”被破坏并且没有给出logname。我想通过其他命令来获得它的功能。命令“who -u”的输出在其结果行之一中包含所需的信息,例如:
schade tty7 2019-04-13 10:01 02:41 2674 (:0)
user1 tty8 2019-04-13 10:05 02:41 3518 (:1)
schade pts/3 2019-04-13 10:33 . 6274 (fd00::eb5d:1659:bda5:8b95)
user2 tty9 2019-04-13 10:34 02:41 6475 (:2)
schade pts/7 2019-04-13 12:16 . 10727 (fd00::eb5d:1659:bda5:8b95)
但在哪一个?我应该找出我当前登录的 pid(这里是 2674,而不是 shell 的 pid)作为每行中的倒数第二个条目,或者将计算机名称作为编码为“:0”的最后一个条目,以将其过滤掉。我怎样才能?
tmux
跟踪文件中的活动会话,在我的系统上,它位于/tmp/tmux-1000/default
. 最近我手动清除了/tmp
目录中的所有内容,删除了这个会话文件。
通常,您可以使用tmux attach
重新附加到会话。可以使用列出活动会话tmux ls
。由于此文件已消失,tmux
因此不知道任何活动会话:
$ tmux attach
no sessions
$ tmux ls
error connecting to /tmp/tmux-1000/default (No such file or directory)
使用top
我可以验证tmux
仍在运行,以及我在该会话中打开的应用程序。
删除会话文件后,如何重新附加到该会话?
如果我打开终端并执行w
命令,那么它将显示:
user tty7 :0 12:04 39:56 36.87s 0.06s /sbin/upstart -
现在,如果打开terminator
或xterm
执行w
命令,那么它将在w
命令的输出中显示它的条目,例如
user tty7 :0 12:04 39:56 36.87s 0.06s
/sbin/upstart -
user pts/2 :0.0 12:50 1.00s 0.02s 0.00s w
gnome-terminal
但是当我打开或时它不会显示新条目xfce4-terminal
。为什么它为终结者而不是 xfce4-terminal 显示新会话?
我正在研究一个我想在sudo
软件测试中运行程序/命令的场景。这些命令是从基于subprocess
模块的 Python 脚本启动的。我试图避免必须以超级用户权限运行整个测试套件。
假设出于本示例的目的,它是top
. 我的命令启动了它自己的一些子进程,并且可能会陷入死锁。超时后,我想杀死它(和它的孩子)。显而易见的解决方案似乎是让我的命令负责一个新的会话/进程组,允许我一次完全杀死它及其子进程。我不知道如何使它与sudo
. 在我的情况下,sudo
总是无一例外地受到密码保护,我想保持这种方式......如果可能的话。
setsid top
sudo setsid top
setsid sudo top
我没有设法使(3)以干净的方式工作。我搞砸了SUDO_ASKPASS
。
令我惊讶的是 (2) 实际运行但没有给我所需的新进程组。
systemd─┬─ ...
├─kdeinit5─┬─ ...
│ └─yakuake─┬─2*[bash]
│ ├─bash───sudo───top
│ ├─bash───pstree
...