【问题标题】:How to open multiple instances of a program in Linux如何在 Linux 中打开程序的多个实例
【发布时间】:2011-09-26 10:00:43
【问题描述】:

比如说,要打开gedit编辑器的多个实例,我写了一个这样的shell脚本-

gedit&
gedit&
gedit&
gedit&

但是在我运行我的shell 脚本./example.sh 之后,我只能找到一个gedit 实例!我什至使用了& 运算符,这样shell 就不会等待一个实例完成。我仍然看不到gedit 的四个实例。

我也直接从命令提示符尝试过。如果我只是在命令行输入gedit&,它显示1906(这是新创建的gedit进程的PID),启动一个新的gedit实例并再次返回提示。当我在命令行输入gedit& 时,这次它显示1909,但没有新的gedit 实例!而且我在系统监视器中也找不到带有PID 1909 的任何进程。这个新流程在哪里消失了?

发生的事情是gedit 特有的吗?如果是这样,创建程序的多个实例时的一般行为是什么?

【问题讨论】:

    标签: linux bash shell command-line


    【解决方案1】:

    它是 gedit 特有的。您可能正在寻找gedit --new-window &

    来自man gedit

    --new-window
           Create a new toplevel window in an existing instance of gedit.
    

    【讨论】:

    • 我不知道这个答案是如何被接受的。 OP特别说他想要多个实例,这个答案特别指出它将在现有实例中打开一个窗口......
    • OP 碰到了X Y problem。我想这个问题的标题应该已经更新,以提及 gedit 而不是谈论通用的“程序”。以这种方式表达确实具有误导性。但是,如果您想运行多个实例,阅读 OP 尝试应该足够有启发性。
    【解决方案2】:

    我来到这里,试图启动多个大胆的实例。

    只允许一个实例实际上更难实现,因为程序需要找到已经运行的实例并与之通信。这是通过 D-Bus 完成的。为了防止与已经启动的实例通信,您可以在另一个 D-Bus 会话中运行该程序:

    nohup dbus-run-session 大胆 & nohup dbus-run-session 大胆 &

    注意:即使终端关闭,nohup 也会保持程序运行。

    此方法也适用于不允许用户在多个实例与一个实例之间进行选择的其他程序。

    请注意,如果多个实例访问相同的配置文件,这可能会引入错误。

    使用 xfce 4.14.1 和 dbus 1.12.20 测试

    对于 Scite:

    scite -check.if.already.open=false &
    

    请注意:

    如果你和我一样,让你的系统运行了多个月,并且编辑了一些快捷方式或别名以使用这个 hack 打开,那么一段时间后,一些程序将不再启动,因为已经有太多打开的 D-巴士会议。在这种情况下,您必须终止已启动的 D-Bus 会话,这些会话不会在已启动的程序关闭时关闭。反过来,杀死 D-Bus 会话也会杀死打开的程序,所以要小心使用!就我个人而言,我有一些长时间运行的自动启动程序,我想保持打开状态(firefox),所以除了前 10 个 D-Bus 会话之外,我用这个杀死了所有的会话:

    for pid in $( ps --sort start_time -aux | grep dbus-daemon | tail +10 | awk '{ print $2; }' ); do kill $pid; done
    

    最干净的解决方案是编写一个启动器脚本,等待程序完成,然后关闭打开的 D-Bus 会话。但这比看起来要困难一些,因为很难找到相应 D-Bus 会话的 PID。

    P.S.:我也使用了这个 hack,因为我的系统上似乎有一些程序,一段时间后,它会减慢系统的默认文件打开对话框,甚至需要几分钟才能打开!然后,程序在尝试保存或打开文件时似乎挂起。出于某种原因,新的 D-Bus 会话似乎可以解决此问题。在写这篇文章时,我发现pkill gvfsd-trash 也可以工作,它可能是this 错误。所以在它发货之前,我想我会在我的 crontab 中添加 pkill gvfsd-trash

    【讨论】:

    • 在尝试打开 texmaker 的 Ubuntu 18.04 上这对我不起作用。
    • 虽然,这个我认为适用于任何程序的解决方案不起作用,如果你因为 Texmaker 而来到这里,这里是解决方案(特定于 texmaker):texmaker -ntex.stackexchange.com/questions/126412/…跨度>
    • 谢谢。传奇。这是我在其他地方的问题的答案。很好的答案。 askubuntu.com/questions/1343783/…
    【解决方案3】:

    这似乎是 gedit 特有的,也许有一些选项可以关闭对正在运行的实例的检查。

    【讨论】:

    • 实际上不仅仅是 gedit,还有大量的应用程序。例如,大多数浏览器会检查正在运行的实例,并且只有在找到实例时才会打开一个新选项卡。 @Pavan Manjunath 你必须检查man 的gedit,它很可能有一个类似--new-instance 的参数或类似的参数,你需要传递以获得一个新窗口。
    • 这就是我的意思,只是特定于他尝试运行的应用程序,而不是与外壳相关的东西:)
    • 但是新进程被创建然后消失呢?如果 shell 决定不打开一个新实例,那么需要创建一个新进程然后杀死它吗?
    • 我的猜测是shell打开了一个进程来检查是否有一个实例正在运行。如果找到一个,则需要传递的任何数据(例如要打开的文件,...)都会传递,然后第二个进程退出。
    【解决方案4】:

    看起来 gedit 首先寻找一个正在运行的实例,然后简单地忽略进一步的启动请求(只是一个疯狂的猜测)。但是手册页说,您可以打开另一个窗口:

    --new-window
                  Create a new toplevel window in an existing instance of gedit.
    

    这并不能完全解决您的问题,但也许这正是您首先要寻找的。​​p>

    祝你好运, 亚历克斯。

    【讨论】:

      【解决方案5】:

      在脚本中使用它。我发现它可以满足我的需要:

      #!/bin/bash
      xterm -e "gedit; bash" &disown
      

      【讨论】:

        猜你喜欢
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-22
        • 1970-01-01
        • 2011-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多