Unix / Linuxシステムのプロセスにコマンドライン引数全体を渡す方法は? [コピー]

Unix / Linuxシステムのプロセスにコマンドライン引数全体を渡す方法は? [コピー]

完全なコマンドライン引数をプロセスに渡す安定した方法を探しています。非常に長い

わかりました。ps -f -p <pid>そして/proc/<pid>/cmdline両方とも通常その仕事をします。問題は、どちらもコマンドライン引数を4096文字に切り捨てているようで、引数が長いことをxargs --show-limits知っています(これはJavaアプリケーションであり、出力はクラスパス文字列の途中で切り捨てられます)。マイシステム最大2094184のパラメータ長が許可されています。

これを行う方法はありますか?

更新:以前にパスに配置したラッパーを作成し、同じ引数で正しいバイナリを呼び出す前に、引数をファイルに書き込むことでコマンドライン引数文字列全体を取得できました。

#!/bin/bash

file=/tmp/commandtrap-$$.log

/usr/bin/echo "$@" >$file
/usr/lib/jvm/java-7-openjdk/jre/bin/java "$@"

ただし、これはプロセスを停止して実行できる場合にのみ機能する醜い回避策です。

理想的には、実行中のプロセスを終了せずに(または何らかの方法で中断せずに)完全なコマンドを取得する方法が必要です。

答え1

一般的に方法がないと思います。オペレーティングシステム固有の方法があります。 Unix / Linuxについて話していますが、特定のオペレーティングシステム用のソリューションに興味がありますか?

たとえば、Solarisはプロセスパラメータを2つの場所に保存します。 1つはカーネルのプロセスに関連する不変バッファです。しかし、カーネルバッファなので、長さが制限されており、コマンドラインが切り捨てられたバージョンかもしれません。

別の場所はプロセス自体のARGV []です。クエリを実行でき(例:を介してpargs)、要約されていないコンテンツを返します。ただし、ARGVはプロセスメモリの一部であるため、いつでも変更できます。内容は、プロセスを開始したコマンドラインとは異なる場合があります。

後続のユーザーが元のコマンドラインを見つけるという保証はありません。


私はちょうど同様の質問に対するStéphane Chazelasの答えを見つけました。ps:コマンド全体が長すぎます。

x86 ELFバイナリでARGV []をデコードしようとするメソッドが含まれているようですが、テストケースではデータを取得できません。理由はわかりません。しかし、技術は合理的なようです。

関連情報