実行中のプロセスをbashのバックグラウンドに移動する単一のショートカット[複製]


1

私が議論し、それを最初に懸濁してバックグラウンドにプロセスを移動する方法を知っているここここに

  1. タイプCtrl+Z
  2. いずれかを実行し%&たりbg

ただし、プロセスを過度に中断せずにこれを行いたいと思います(もう一度起動するために入力している間、長時間停止しないでください)。たとえば、オーディオを再生していて、干渉したくない場合。実行中に実際に移動する方法はないようですが(これこれを参照)、上記の両方の操作を1ステップで実行する単一のショートカットを喜んで受け入れます。

同様の質問がここにありますが、zshについて:1つのキープレスでCtrl-Zとbgを実行してプロセスをバックグラウンドで続行するにはどうすればよいですか?


1
このようなプロセスを開始できることを既に知っていると思いますか?mp3blaster song.mp3 &?(&はバックグラウンドで開始します)。
ヘネス

@Hennesうん、フォアグラウンドで何かを実行しているとき、間違ったジョブをフォアグラウンドに持ってきたのか、それとも他の何かを実行したくないと思ったのか、もっと興味があります。
jozxyqk

あなたはレプティルを見ましたか?現在の画面にプロセスを「つかむ」ことができます。したがって、新しい「スクリーン」セッションを開始してから、別の端末から長時間実行プロセスを取得し、それを新しいスクリーンセッションに「プル」できます。また、これは「スクリーン」セッションなので、接続を解除して実行を継続できます。プロセス自体をバックグラウンドではありませんが、目的に役立つ可能性があります。そして、Debianデリバティブのapt-getを介して利用できると思います。
gogoud

@gogoudありがとう、それはかなりまともなようです(詳細はこちら)が、現時点ではできるだけ軽量で、プロセスが中断される時間を最小限に抑えたいと思っています。
jozxyqk

そのほかの質問@jozxyqkについてですzsh、これはについてですbash
ケビン・パン粉

回答:


0

コマンドは確かに組み合わせることができますが、それらをトリガーすることは困難です。

1つのオプションは、シェルでCtrl-Zをバインドすることです。そのため、一度押すと中断し、再びになりbgます。

私の解決策は、作業を行うスクリプト実行するグ​​ローバルショートカット設定することです。まず、アクティブなターミナルウィンドウで実行されているシェルPIDが取得されます。次に、プロセスをフォアグラウンド取得し、最終的に中断して再開します。あなたがそれを殺したいなら、同じことが働く。

厄介な問題は、KDEのコンソールであり、すべてのターミナルウィンドウに1つのプロセスがあります。私はここで答えを見つけました、または少なくとも正しい方向に私を指し示しました:http : //wundermark.blogspot.com.au/2013/01/the-sick-and-twisted-world-of.html?m=1

スクリプトは次のとおりです。

#!/bin/bash

#get the active window
WID=$( xprop -root _NET_ACTIVE_WINDOW | grep -o '0x[0-9a-f]\+' )

#get the parent's process ID (looks like I don't need this as there's only ever one konsole/gnome-terminal process running)
TPID=$( xprop -id $WID _NET_WM_PID | grep -o '[0-9a-f]\+' )

#get the window class, to check what terminal is running
TERM=$( xprop -id $WID WM_CLASS | grep -o 'konsole\|gnome-terminal' ) #change this to match your terminal. only tested with konsole

#quit if a terminal is not active
if [[ -z "$TERM" ]] ; then
    exit -1
fi

#get bash PID for the window, somehow
if [[ "$TERM" == "konsole" ]] ; then
    #this seems really really roundabout, but here goes..
    #for every konsole window (which may have many tabs/sessions)
    for WINDOW in $( qdbus org.kde.konsole /Windows org.freedesktop.DBus.Introspectable.Introspect | grep "node name" | grep -o "[0-9]\+" ) ; do
        #get the "current" session, which I guess is the active tab. seems to work
        SESSION=$( qdbus org.kde.konsole /Windows/$WINDOW org.kde.konsole.Window.currentSession )

        #get the window ID from the environment variables (why is not available via qdbus??)
        KWID=$( qdbus org.kde.konsole /Sessions/$SESSION org.kde.konsole.Session.environment | grep WINDOWID | grep -o "[0-9]\+" )

        #convert it to hex, to match the query at the top
        KWID=$( printf "0x%x\n" $KWID )

        #if this active tab is in the active window, it's the one we want. grab the PID of the shell
        if [[ "$WID" == "$KWID" ]] ; then
            SHELL_PID=$( qdbus org.kde.konsole /Sessions/$SESSION org.kde.konsole.Session.processId )
            break
        fi
    done
else
    ps --ppid $TPID #<- need to figure out which bash PID for the WID, as above for KDE
    echo "only works for KDE atm. sorry"
    exit -1
fi

echo WID=$WID PID=$PID TERM=$TERM SHELL_PID=$SHELL_PID

#find the foreground process
ps -O stat --ppid $SHELL_PID | grep -v PID | while read CHILD ; do
    if [[ -n "$(echo $CHILD | awk '{print $2}' | grep \+)" ]] ; then
        PID=$( echo $CHILD | awk '{print $1}' )
        kill -SIGSTOP $PID
        sleep 0.0001 #??
        kill -SIGCONT $PID
        break
    fi
done

これはうまく機能します。例えば、

>>> sleep 100 #press shortcut here

[1]+  Stopped                 sleep 100
>>> jobs #check it's been restarted
[1]+  Running                 sleep 100 &
>>> 

ただし、グローバルショートカットを設定し、アクティブなターミナルとシェルを取得できるウィンドウマネージャーに依存しています。sshが実行されていると言うと問題があるかもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.