
題名の通りですがLinuxで、$0が書き換えられた状態で実行されているperlスクリプトの絶対パスを取得する方法はあるでしょうか?
/proc/$PID/exe → /usr/bin/perlが表示される
/proc/$PID/cwd → 別のディレクトリから実行されていると意味がない
/proc/$PID/fd → 見つからない
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
ベストアンサー
/proc/$PID/cmdline
でわかりませんでしょうか。
\0
区切りです。
###(2015/11/23 追記)
Linux ならば audit を使って監査ログを取る方法が考えられます。
(CentOS 7 の場合の例) # systemctl start auditd // auditd サービスを起動 # auditctl -w /usr/bin/perl -p x // /usr/bin/perl が実行されたら監査ログに記録 # /root/test.pl & // perl スクリプト実行 # ausearch -p (PID) または # ausearch -x /usr/bin/perl time->Mon Nov 23 09:24:36 2015 type=PATH msg=audit(1448238276.515:61): item=2 name=(null) inode=16879080 dev=fd:00 mode=0100755 ouid=0 ogid=0 rdev=00:00 objtype=NORMAL type=PATH msg=audit(1448238276.515:61): item=1 name=(null) inode=9571154 dev=fd:00 mode=0100755 ouid=0 ogid=0 rdev=00:00 objtype=NORMAL type=PATH msg=audit(1448238276.515:61): item=0 name="/root/test.pl" inode=18699758 dev=fd:00 mode=0100755 ouid=0 ogid=0 rdev=00:00 objtype=NORMAL type=CWD msg=audit(1448238276.515:61): cwd="/" type=EXECVE msg=audit(1448238276.515:61): argc=2 a0="/usr/bin/perl" a1="/root/test.pl" type=SYSCALL msg=audit(1448238276.515:61): arch=c000003e syscall=59 success=yes exit=0 a0=13d0880 a1=13c24e0 a2=13ab200 a3=7fff38785730 items=3 ppid=839 pid=1015 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="test.pl" exe="/usr/bin/perl" key=(null) // PATH や EXECVE の引数がわかる。
ただし、既に起動しているプロセスには使えません。
auditctl で設定したルールは auditd を再起動すると消えてしまいます。
auditd 起動時に有効にするには /etc/audit/audit.rules に設定(または、/etc/audit/rules.d/audit.rules などに設定後、augenrules 実行)します。
投稿2015/11/22 14:08
編集2015/11/23 00:49総合スコア12193
0
FindBinを使うと、スクリプトの絶対パスが取得できるようです。
FindBinで検索してみてください。
例:
perl
1use FindBin; 2 3print "Path = $FindBin::Bin \n"; 4print "Script = $FindBin::Script\n";
投稿2015/11/22 14:05
総合スコア815
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。


0
FindBin
というモジュールを使う方法があるようです。
ただし、以下の制限があるようです。(参考リンク1から引用)
mod_perlなど持続するPerl環境下で、2つのモジュールがそれぞれ違うディレクトリからFindBinを使うとうまく動かないかも。なのでCPANに登録しようと思っているモジュールではFindBinは避ける。
サンプルコード:
lang
1use FindBin; 2 3my $dir = $FindBin::Bin; 4my $script = $FindBin::Script; 5 6# 絶対パス 7my $abspath = "$dir/$script";
参考リンク:
FindBin 実行パスを見つける - あじゃぱー
http://d.hatena.ne.jp/minesouta/20070818/p1
FindBin - perldoc.perl.org
http://perldoc.perl.org/FindBin.html
投稿2015/11/22 14:02
総合スコア9396
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/11/22 14:16
2015/11/23 00:41
退会済みユーザー
2015/11/23 02:53