2

私はUNIXスクリプトを持っています。適切な引数なしで他のスクリプトによって呼び出されました。発信者の名前を知る方法はありますか? スクリプトの名前が複数のスクリプトに渡されて動的に呼び出されるため、grep は役に立ちませんでした。最終的に自分のスクリプトを呼び出すスクリプトを取得したいですか? ともかく?

4

2 に答える 2

4

いいえ、UNIX プロセスが それを生成したプロセスを事後的に知る完全に信頼できるものはありません。スクリプト (そのshインタープリター) が実行されるexecve()までに、その親が終了するか、別のプログラム イメージに置き換えられている可能性があります。

とはいえ、スクリプトは平静を保ち、プロセス テーブルと独自の環境に基づいて合理的な推測を行うことができます。

ps -o args= $PPID現時点で、スクリプトの親のコマンドラインを移植可能に表示する必要があります。これは通常は機能します。

$PPID == 1 の場合、あなたは孤児でinitあり、養親です。 ps -o uid-,gid=,pgid=,tty= $$スクリプトのユーザーとグループ ID、プロセス グループ ID、および制御端末を明らかにします。これらは通常、変更なしで親から直接継承されるため、親自体が終了した場合でも、少し掘り下げれば、グループを生成したセッションを見つけるのに役立つ場合があります。

于 2013-09-25T13:29:26.690 に答える
1

straceシステムコールをトレースできるユーティリティを使用できます。

このサイトのいくつかの使用例の 1 つを次に示します。

$  strace ls
execve("/bin/ls", ["ls"], [/* 21 vars */]) = 0
brk(0)                                  = 0x8c31000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb78c7000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=65354, ...}) = 0
...
...
...
于 2013-09-25T11:58:00.877 に答える