procや他の非標準ツールを使用せずにコマンドラインから元のコマンドを実行するにはどうすればよいですか?
印刷プロセスリストを使用すると、ps
コマンドを開始するために渡されたパラメータは引用符なしで表示されます。これは元のコマンドが実行された方法ではありません。ps
これを達成できるオプションの組み合わせもないようです。
しばらく検索して、見つけにくいps
ソースコードを探しても、まだ簡単な答えが見つかりませんでした。現在、同じ問題に言及する他の投稿がありますが、答えがないか満足のいく解決策を提供しています。ps
必要な結果を得るためにソースコードを編集することができますが、このアプローチはps
実際にはオペレーティングシステムごとにエンコードが大きく異なる非標準パッケージなので、お勧めできません。たとえば、ps
MacOSのソースコードはUbuntuのソースコードとは大きく異なりますps
。
答え1
他のプロセスのコマンドラインを明示的に表現する移植可能な方法はありません。不可能なので希望の答えが見つかりませんでした。あいまいな表現を処理したり、コードが実行されているオペレーティングシステムに応じて異なるアプローチを使用したり、タスクの代わりに実行する人を見つける必要があります。
これPOSIX仕様ps
このフィールドの形式args
は、「コマンドとすべての引数を文字列として含める」と切り捨てることができることを除いては指定されません。実際に私が見たすべての実装は、引数を空白で引数に連結します。これがPOSIXでできる最善の方法です。
プロセスのコマンドライン引数を明示的に表現するには、Solarisなどのprocファイルシステムを使用するLinuxや他のUnixバリアントで見つけることができます(したがって、macOSなどのBSDシステムでは見つかりません)。パラメータは、パラメータには表示できないヌルバイトで区切られているため、表現は明確です。私はLinux procpsユーティリティを使用してこの情報を取得する方法がないと思いますが、もしあればそれはLinuxに限定されているので、移植性は高くはありません(実際には閲覧もするので移植性が低下します)。 Linuxカーネルの他のユーティリティ(BusyBoxのユーティリティなど)があるシステムで動作します。/proc/PID/cmdline
ps
/proc
ps
macOSでコマンドライン引数を明示的に表現する方法がわかりません。
移植不可能な部分を実行するプログラムを知っています。Pythonライブラリプスチル。 Linuxでプロセスのコマンドラインを明示的に表現できることを確認できます。ドキュメントに制限が記載されていないため、macOSでも機能します。しかし、まだテストしたことはありません。
python3 -c 'import os, psutil; print(psutil.Process(os.getpid()).cmdline())'