ローカルで作業していたときから、リモートマシンでスクリプトを実行したままにしました。 SSH経由で同じユーザーとしてマシンに接続し、ps
で実行されているスクリプトを確認できます。 。
$ ps aux | grep ipcheck
myuser 18386 0.0 0.0 18460 3476 pts/0 S+ Dec14 1:11 /bin/bash ./ipchecker.sh
ローカルセッションのstdoutに出力しているだけです(./ipchecker.sh
を実行しました ローカルターミナルウィンドウを形成し、リダイレクトやscreen
の使用はありません など)。
とにかくSSHセッションから、この実行中のコマンドの出力を(停止せずに)表示できますか?
これまでのところ、私が見つけた最善の方法は、strace -p 18386
を使用することです。 しかし、画面上に大量のテキストが表示され、詳細すぎます。 strace
を停止できます 次に、出力をふるいにかけて、テキストがstdoutに印刷されていることを確認しますが、非常に長くて混乱します。明らかに、停止している間、何かを見逃す可能性があります。ローカルで作業しているかのように、スクリプトの出力をライブで確認する方法を見つけたいと思います。
誰かがこれを改善できますか?明白な答えは、リダイレクトまたはscreen
でスクリプトを再起動することです セッションなど、これはミッションクリティカルなスクリプトではないので、それを行うことができます。むしろ、これは楽しい学習演習だと思います。
承認された回答:
既存のプロセスをスパイするだけの場合は、strace -p1234 -s9999 -e write
を使用できます。 ここで、1234はプロセスIDです。 (-s9999
文字列が32文字に切り捨てられないようにし、write
出力を生成するシステムコール。)特定のファイル記述子に書き込まれたデータのみを表示する場合は、strace -p1234 -e trace= -e write=3
のようなものを使用できます。 ファイル記述子3に書き込まれたデータのみを表示するには(-e trace=
システムコールがログに記録されないようにします)。すでに作成されている出力は得られません。
出力のスクロール速度が速すぎる場合は、less
などのページャーにパイプで送ることができます。 、またはstrace -o trace.log …
を使用してファイルに送信します 。
多くのプログラムでは、ptraceハックを使用して、現在の端末または新しい画面セッションのいずれかに後続の出力を転送できます。実行中のプロセスの所有権を剥奪し、それを新しい画面シェルに関連付けるにはどうすればよいですか?を参照してください。およびその他のリンクされたスレッド。
システムの設定方法によっては、これらすべてのstrace
を実行する必要がある場合があることに注意してください。 プロセスが追加の権限なしでユーザーの下で実行されている場合でも、rootとしてコマンドを実行します。 (プロセスが別のユーザーとして実行されている場合、またはsetuidまたはsetgidである場合は、strace
を実行する必要があります。 ほとんどのディストリビューションでは、プロセスがその子を追跡することしかできません(これにより、中程度のセキュリティ上の利点が得られます。マルウェアの直接的な注入は防止されますが、ファイルの変更による間接的な注入は防止されません)。これは、kernel.yama.ptrace_scome
によって制御されます。 sysctl。