web-dev-qa-db-ja.com

プログラムをアクティブにするコマンド(実行するか、既に実行されている場合は前面に表示する)

プログラムを開始するか前面に表示するためのキーボードショートカットが必要です。 (重要な場合はsqldeveloper)

私はそれを実行する方法を知っています、それは残します:

1)プログラムがすでに実行されているかどうかを確認するにはどうすればよいですか?

2)プログラムを他の開いているウィンドウの上部に移動するにはどうすればよいですか?

~~編集~~

これまでの回答に感謝します。実行中のプロセスのリストを取得するためにこれらのコマンドのいずれかを実行すると、次の結果が得られます。

doneill   3492     1  0 Nov16 ?        00:00:00 /bin/sh /usr/local/bin/sqldeveloper
doneill   3493  3492  0 Nov16 ?        00:00:00 /bin/bash /opt/sqldeveloper/sqldeveloper.sh
doneill   3495  3493  0 Nov16 ?        00:00:00 bash sqldeveloper
doneill   3552  3495  1 Nov16 ?        00:25:07 /usr/lib/jvm/Java-6-Sun-1.6.0.22/bin/Java -Xmx640M -Xms128M -Xverify:none -Doracle.ide.util.AddinPolicyUtils.OVERRIDE_FLAG=true -Dsun.Java2d.ddoffscreen=false -Dwindows.Shell.font.languages= -XX:MaxPermSize=128M -Dide.AssertTracingDisabled=true -Doracle.ide.util.AddinPolicyUtils.OVERRIDE_FLAG=true -Djava.util.logging.config.file=logging.conf -Dsqldev.debug=false -Dide.conf="/opt/sqldeveloper/sqldeveloper/bin/sqldeveloper.conf" -Dide.startingcwd="/opt/sqldeveloper/sqldeveloper/bin" -classpath ../../ide/lib/ide-boot.jar Oracle.ide.boot.Launcher

.shスクリプトを使用して起動します。これはJavaベースのプログラムです。そのうち興味があるのはどれですか? xdotoolを使って値を上げようとしましたが、まだ成功していませんが、今夜はmanページを掘り下げる時間はありません。

xdotool search Orac(「Oracle SQL Developer」がウィンドウのタイトルの先頭です)を実行すると、一連の数字が返されます。これらの1つは、私が興味を持っていることを表していますか?

6
David Oneill

ちょっとしたbashと xdotool でうまくいくはずです。投稿の最後にxdotoolをインストールする際の注意。

ActivateOrLaunch.sh

#!/usr/bin/env bash

# usage:
#    ActivateOrLaunch.sh firefox-bin
#
# Will launch firefox-bin or activate the first window in the windows stack
# --- Remember to chmod a+x ActivateOrLaunch.sh in order to execute.

# pgrep looks through the currently running processes and lists the process
#       IDs which matches the selection criteria to stdout
#       for more information on pgrep http://linux.die.net/man/1/pgrep

# if process is found by pgrep then pipe through head to get firt instance in
#    case of multiple processes running. If process not found $pid will be empty
pid=$(pgrep ${1} | head -n 1)

# Using "-z" check if $pid is empty, if so execute the process
if [ -z "$pid" ]; then
   echo "$1 not running... executing..."
   $1 &
else
   # process was found, find the first visible window and activate it
   echo "Found process $1 with PID $pid"

   # using xdotool [http://www.semicomplete.com/projects/xdotool/] get the first
   # visible windows using $pid. Redirect stderr to /dev/null and only select
   # the first visible windows using head
   wid=$(xdotool search --onlyvisible --pid $pid 2>/dev/null | head -n 1)

   # if $wid is empty the process does not have any visible windows... do nothing
   if [ -z "$wid" ]; then
     echo "Didn't find any visible windows for process $1 with PID: $pid"
   else
     # send the window id ($wid) from the window stack to xdotool
     echo "Activating first windows in stack"
     xdotool windowactivate $wid
   fi
fi

# ******** NOTES **********
# In order for this script to work correctly you need to pass the complete process 
# name for it to find any visible windows. The process needs needs to be in the path
# for it to execute if not running.
#
# For example
#
# If you try it with firefox-bin on Ubuntu 10.10 it will find the running process and 
# activate the window, but it will not be able to launch the process since the executable 
# in the path is called firefox which is a link to firefox.sh
# (/usr/bin/firefox -> ../lib/firefox-3.6.12/firefox.sh) which in turn executes firefox-bin
# (not in path).
#
# Next, if you use firefox it will find a process but won't be able to find any windows 
# since it's a wrapper function calling firefox-bin and doesn't have any windows. 

コードは github にあります。

Ubuntu 10.10(Gnome)でコードをテストし、動作しました。入力したばかりで、きれいにすることを心配していなかったので、いくつかの磨きが必要です(コメントを確実に入力したい)

Xdotoolをインストールするには、apt-get install xdotool(この取得したバージョン2.20100701.2691を作成します)、最新の最高のものを入手したい場合- こちら (20101116現在、バージョン2.20101012.3049-4)

5
SiliconChaos

ホームディレクトリにsql-raise.shというファイルを作成します

#!/ bin/sh 
 if ps -ef | grepプロセス名| grep -v grep; then 
#プロセスは実行中です。最前面に移動します
 xdotool search --name process-name windowraise 
 exit 0 
 fi 
 
#プロセスは実行されていません。開始してください
プロセス名

if ps -ef...で始まる行は次のように変換されます。

  • 実行中のすべてのプロセスをリストする
  • process-nameを含まない行を除外します
  • grepコマンド自体を除外して、誤検知を防止します

xdotoolで始まる行は、プロセスを前面に表示する行です。

コマンドラインでchmod +x ~/sql-raise.shを実行して、ファイルを実行可能にします。

これをキーにバインドするには、[システム]-> [設定]-> [キーボードショートカット]を使用します

2
Jeremy

'launchorsitch.sh firefox'は、実行されていない場合はfirefoxを起動し、アクティブでない場合は切り替え、アクティブウィンドウの場合は最小化します。

#!/bin/bash
# usage: "launchorswitch.sh xterm" to change to/start/hide xterm
app=$1
app_win_id=`wmctrl -lx|grep -i $app|cut -d ' ' -f 1`
case $app in
    terminator)
        app_exec="terminator --geometry=1000x720+140+28"
    ;;
    *)
        app_exec=$app
    ;;
esac
if [ -z $app_win_id ]; then
    $app_exec & # app not started, so start it
else

    active_win_id=`wmctrl -r :ACTIVE: -e 0,-1,-1,-1,-1 -v 2>&1|grep U|cut -d ' ' -f 3`
    if [ $app_win_id == $active_win_id ]; then
        wmctrl -r :ACTIVE: -b toggle,hidden    # hide app when active
    else
        wmctrl -i -a $app_win_id    #switch to app
    fi;
fi;

最初はプログラムの特別なルールがあります(ここではターミネーターです)。私のハックはwmctrlを使用し、どの実行可能ファイルを検索/実行するかについての特別なルールを指定できます。スタイルに関するコメント、明らかな間違いなどは歓迎します。

2
turbo