コマンドは確かに組み合わせることができますが、それらをトリガーすることは困難です。
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が実行されていると言うと問題があるかもしれません。
mp3blaster song.mp3 &
?(&はバックグラウンドで開始します)。