で始まるプロセスを置く!バックグラウンドで


8

シェルからこれを行うと:

$ sleep 100

私はそれをバックグラウンドにすることができます:

^Z
$ bg

そして、私のシェルを使い続けます。&コマンドの最後にa を追加することで同じ効果を得ることができますが、これはよく忘れます。

Vimでは、私はよくします:

:!sleep 100

そしてここでも、を追加するのを忘れがち&です。このプロセスをバックグラウンドで実行し、シェルのようにVimを引き続き使用できますか?


1
再び忘れないように、Vimに&毎回追加するように要求できます:nnoremap :! :!&<Left>。...もちろん、場合によっては、を必要とせず&、<Del>を押して削除する必要があります。
joeytwiddle

@joeytwiddleこれは良いアイデアであり、単なるコメントではなく、回答として記述できるもののように聞こえます:-)
Martin Tournoij

回答:


5

<C-z>Vimの自体だけでなく、立ち上げたシェルコマンド、それはないだろう作業を中断します。

私がやろうとしていることは、で長時間実行されているコマンドを中止してから<C-c>、同じコマンドをバックグラウンドで再起動することです

:!! &

(この:!!コマンドは、前の外部コマンドをここで呼び出すために便利です。また、を介してExコマンド履歴を使用することもできます<Up>。)


1
これはまさに私が改善を望んでいるワークフローです。問題は...あなたが始めたものは何でも近くに必要があるということです
マーティンTournoij

1

コマンドは、バックグラウンドで実行されるシェルスクリプトに配置できます。たとえば、コンテンツは次のようになります。

#!/bin/sh
sleep 100 &

3
コマンドが既に開始されている場合、これはあまり役に立ちません。
muru

つまり、slowコマンドの代わりにシェルスクリプトを実行できます。バックグラウンド自体があると、実行時にそれを行うことを覚えておく必要がなくなります。ユースケースをよく理解していないと思います。バックグラウンドで忘れているコマンドと同じであれば、シェルスクリプトを使用します。これが任意のコマンドで発生している場合は、実際のシェルに切り替えてそうする習慣をつけることを検討します。
ジョンカーター、

私はtmuxデフォルトで使用していますが、問題は私のVimセッション(開いているファイルなど)がまだ役に立たないことです。私は可能性があり、別のウィンドウに切り替えて、そこに私のスクリプトを実行しますが、より多くのアクションであること:!gitk %例えばが...スクリプトを使用しての事は、私はすべての可能なコマンドのためにこれらのスクリプトの多くを事前に作成しなければならないということです。おそらく、最もよく使われるコマンド(gitk&などmupdf)のいくつかにとっては、それは悪い考えではありません。
Martin Tournoij、2015

1

通常、プロセスが開始されたとき、プロセスを終了(Ctrl+ c)または一時停止(Ctrl+ z、ただし親プロセスを含む)する以外に、それを制御することはできません。

ただし、プロセスの種類とオペレーティングシステムによっては、次のようなトリックを試すことができます。

  • 送信SIGTSTP又はSIGSTOPプロセス(によって送信された同一の信号を停止しますCtrl+をz)、及びSIGCONT(レジューム)処理を継続します。でのテストはsleep機能しないため、信号を処理する方法を特定のソフトウェアでテストする必要があります。例えば

    killall -SIGSTOP sleep
    killall -SIGTSTP sleep
    kill -SIGTSTP PID
    

    SIGSTOP停止プロセスの停止(キャッチまたは無視できません)

    キーボードから生成されたSIGTSTP停止プロセス停止信号

  • SIGHUPプロセスに送信しています。デフォルトでは、このシグナルはプロセスを終了しますが、プロセスがSIGHUPシグナルを実装している場合は、制御ttyから切り離し、新しいプロセスIDでバックグラウンドで再実行する必要があります(通常、デーモンで使用されます)。残念ながら、多くのアプリケーションはそれを正しく処理せず、単に(を含めてsleep)終了します。例えば

    killall -SIGHUP sleep
    

    SIGHUP プロセス端末回線のハングアップを終了する

  • 他の解決策は、次のようなツールを使用することができるretty(仮想端末に再付着)、 detach(端末からプロセスを切り離し)、 nohup切断端末からの処理)またはgdb(既存のプロセスにアタッチ-pして閉じ、そのファイルがtty、同様のような記述子の例)。

詳細については、ジョブコントロール(Unix)-Wikipediaの実装を確認してください。

man killまたはも参照してくださいman sigaction


これがあなたのために働くのは奇妙です—それはそうではありません。STOP / CONTは、プロセスを一時停止して再開するだけです。ここでは、コンソールvimまたはgvimのどちらでも機能しません。
derobert

1

:この回答はtcshfishシェルでのみ機能するようです。私も試してみましたbashdashmksh、そしてzsh、それはしませんが動作します。Vimなしでこれらのシェルから同じアクションを実行した場合、期待どおりに動作するため(理由はわかりません)(:!コマンドはシェルを介して実行されます)。

私はたまたま使用tcshしているので、うまくいきます...

を使用:set shell=/bin/tcshしてシェルを設定できます。ただし、これはグローバルです。したがって、これが非常に重要な機能であると思われる場合にのみ使用してください:-)


^Z送信SIGTSTP信号を、あなたは、この信号を送信することができますkill使用した後、およびSIGCONT(再開)プロセスを継続します。これはプロセスをVimから切り離します。

これを表示するのは難しいためsleep(実行が継続していることをどのようにして知ることができますか?)、gitk例として使用します(ただし、どのGUIプログラムでも実行できます)。

たとえばVimの場合:

:!gitk %

そして別のターミナルで:

$ ps ax | grep gitk
30105 pts/10   S+     0:00 -bin/tcsh -c gitk
30108 pts/10   Sl+    0:00 wish /sbin/gitk --

$ kill -TSTP 30108
$ kill -CONT 30108

もちろんkillall、またはpkill; も使用できます。例えば:

$ killall -TSTP wish
$ killall -CONST wish

これには別のターミナルを開く必要がありますが、これは理想的ではありませんが、Vimと外部プロセスの両方を使い続けることができます。

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