Bashインスタンスで実行されている正確なコマンドラインをどのように確認できますか?

Bashインスタンスで実行されている正確なコマンドラインをどのように確認できますか?

ループ内で複雑な命令セットを実行する長期実行bashインスタンス(セッション内)があります(各ループはパイプ、リダイレクトなどを実行します)。screen

長いコマンドラインは端末内に作成され、スクリプト内にはありません。これでb​​ashプロセスIDを知り、rootアクセス権ができました。ここで実行された正確なコマンドラインをどのように表示できますかbash

はい
bash$ echo $$
1234
bash$ while true ; do \
    someThing | somethingElse 2>/foo/bar | \
    yetAnother ; sleep 600 ; done

別のシェルインスタンスでPID 1234内で実行されているコマンドラインを表示したいと思います。

bash$ echo $$
5678
bash$ su -
sh# cd /proc/1234
sh# # Do something here that will display the string  \
   'while true ; do someThing | somethingElse 2>/foo/bar | \
    yetAnother ; sleep 600 ; done'

可能ですか?

編集#1

私が得た答えのいくつかに反例を追加します。

  1. cmdlineunderの使用に関して/proc/PID:少なくとも私のシナリオでは動作しません。簡単な例は次のとおりです。

    $ echo $$
    8909
    
    $ while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
    

    他のシェルから:

    $ cat /proc/8909/cmdline
    bash
    
  2. また、役に立たないps -p PID --noheaders -o cmd

    $ ps -p 8909 --no-headers -o cmd
    bash
    
  3. ps -eafまた、役に立ちません:

    $ ps -eaf | grep 8909
    ttsiod    8909  8905  0 10:09 pts/0    00:00:00 bash
    ttsiod   30697  8909  0 10:22 pts/0    00:00:00 sleep 30
    ttsiod   31292 13928  0 10:23 pts/12   00:00:00 grep --color=auto 8909
    

    つまり、生のコマンドラインには出力がありません。これは私が探しているものですwhile true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done。つまり。

ベストアンサー1

私はジフラーでも持っていることを知っていますが、UNIXは決して失敗しません!

これが私が処理する方法です。

bash$ gdb --pid 8909
...
Loaded symbols for /lib/i386-linux-gnu/i686/cmov/libnss_files.so.2
0xb76e7424 in __kernel_vsyscall ()

次に、(gdb)プロンプトでコマンドを実行してcall write_history("/tmp/foo")履歴をファイルに書き込みます/tmp/foo

(gdb) call write_history("/tmp/foo")
$1 = 0

その後、プロセスを中止します。

(gdb) detach
Detaching from program: /bin/bash, process 8909

そして終了しますgdb

(gdb) q

本当に...

bash$ tail -1 /tmp/foo
while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done

今後の再利用を容易にするために、次のように作成しました。バッシュスクリプト、プロセスを自動化します。

おすすめ記事