我想重命名某些可执行文件的副本,在执行时使用不同的进程。
系统:Lubuntu 18.04 桌面 64 位。
例如:
$ sudo cp -a /usr/bin/mate-terminal /usr/bin/mate-terminal-left
$ sudo cp -a /usr/bin/mate-terminal /usr/bin/mate-terminal-right
从启动器中,我执行mate-terminal-left
,这会在屏幕的左半部分打开一个终端窗口(由于我对 OpenBox 窗口管理器的配置设置)。
仅供参考,我在该终端中执行以下命令:
$ ps -eo pid,command | grep -i 'terminal' | grep -ve 'grep'
19294 /usr/bin/mate-terminal-left
现在,在左侧终端仍然打开的情况下,我从另一个启动器执行mate-terminal-right
,这应该在屏幕的右半部分打开一个终端窗口。但是,mate-terminal-right
没有创建新进程,而是使用了已经活动的mate-terminal-left
进程,因此它也在左侧打开。
$ ps -eo pid,command | grep -i 'terminal' | grep -ve 'grep'
19294 /usr/bin/mate-terminal-left
当我mate-terminal-right
先打开时,它会在右侧打开,然后mate-terminal-left
也会在右侧结束。
我发现某些可执行文件(例如 Geany)非常适合我的左右重命名方法,但其他可执行文件(例如mate-terminal
和 )pcmanfm
对所有实例使用相同的进程,即使以不同的名称启动也是如此。
我的问题是:我怎样才能使mate-terminal-left
和mate-terminal-right
每个打开作为单独的进程?
针对以下建议如何制作左右终端的评论,感谢您的建议。然而,这不是我的问题所问的。我仅使用该示例来具体解释为什么有人可能希望在多个进程中运行相同的可执行文件,而不是在同一进程中运行多个实例。我mate-terminal
仅用作示例,因此我不是在寻找另一个终端。
这个问题的标题就是我要问的问题:“如何使可执行文件的副本作为单独的进程打开?”
答案1
您在这里看到的内容是相当特定的mate-terminal
,尽管更普遍地使用一些共享的 GNOME/GTK+ 基础设施,您也可能在其他应用程序中找到这些基础设施(您pcmanfm
也提到过)。
当您启动 的新副本mate-terminal
(可能来自不同的二进制文件)时,它做为其创建一个新进程。但mate-terminal
被编程为连接到 D-Bus 并尝试查找“工厂”,在这种情况下,它将向其传递有关在终端中启动的内容的参数,并让“工厂”对其进行管理,然后终止新进程。 (如果没有工厂,它会将自己注册为工厂,这就是为什么启动的第一个进程将最终管理所有终端。)
“工厂”是通过其 D-Bus 路径 找到的,/org/mate/Terminal/Factory
即硬编码的进入二进制文件。 (因此,复制到二进制文件的其他副本中。)
在具体情况下mate-terminal
,您可以通过向其传递--disable-factory
命令行参数来禁用此行为。 (看手册页更多细节。)
这对于mate-terminal
工作方式来说是相当独特的。特别是,pcmanfm
实际上并没有以同样的方式做到这一点。目前尚不清楚是否pcmanfm
支持启动单独进程的方式,或者其工作的唯一方式是否是通过 D-Bus 与现有实例进行通信。 (你必须调查pcmanfm
一下是否如此。)
答案2
解决方法:使用创建单独进程的工具
我有一个 shellscript,它在我的主计算机的桌面上创建三个终端窗口。根据我的脚本中的一些想法,我做了以下尝试,这可能对您有用(或帮助您制作您需要的东西),
#!/bin/bash
vdockw=0 #68
hdockw=60
resol=$(xrandr|grep current|cut -d, -f2)
resol=$(<<< "$resol" sed 's/.*current //')
echo $resol
xres=${resol%% *}
yres=${resol##* }
echo $xres $yres
xmid=$(( (xres-vdockw)/2 ))
ymid=$((yres-hdockw))
echo $xmid $ymid
#xterm -title "term v" & pid=$!
sakura --title="term v" & pid=$!
sleep 0.5
wid=$(wmctrl -lp | grep "$pid" | cut "-d " -f1)
sleep 1
echo $pid $wid
wmctrl -i -r $wid -e 1,0,0,$xmid,$ymid
#xterm -title "term h" & pid=$!
sakura --title="term h" & pid=$!
sleep 0.5
wid=$(wmctrl -lp | grep "$pid" | cut "-d " -f1)
sleep 1
echo $pid $wid
wmctrl -i -r $wid -e 1,$((xmid+vdockw)),0,$xmid,$ymid
我测试过它可以在两个已安装的 18.04 LTS 系统中运行:Lubuntu(按原样)和标准 Ubuntu(带有vdockw=68
)。
shellscript 使用程序包sakura wmctrl
和 Maybe xterm
,它们可以从存储库中获得universe
,并且可以使用以下命令安装
sudo apt update
sudo apt install sakura wmctrl xterm