blog

Linuxでプロセスのイニシエータをトレースする

Linuxでは、プロセスのイニシエータを確認したい場合、例えばユーザtomがシステムにログインし、sudo su - to rootでhey.shというスクリプトを実行した場合、hey.shのプロセス...

Nov 11, 2013 · 2 min. read
シェア

Linuxでプロセスのイニシエータの身元を確認するには、例えば、ユーザーtomがシステムにログインし、sudo su - rootに、その後スクリプトhey.shを実行し、hey.shのプロセスのイニシエータにさかのぼることは非常に簡単ではありませんユーザーtomは、それは非常に正確に行うのは簡単ではありません、それは私が比較的信頼性の高い方法を見つけるためにいくつかの時間がかかりました。

まず、遭遇したいくつかの問題から始めましょう:

  1. ユーザがログインし、sudo hey.shでhey.shを実行した場合、環境変数SUDO_USERからsudoユーザを取得することは可能ですが、上述のようにsudo suでユーザの環境変数を継承しない問題を解決する方法はありません。
  2. ttyコマンドで現在のプロセスの制御端末を取得し、制御端末ファイルの所有者でログインユーザーを確認することで、1の問題を解決することができます。しかし、現在のプロセスの親プロセスがデーモンであったり、標準入力がオフになっていたりすると、制御端末が存在しません。ターミナルがありません。
  3. proc/self/loginuidを読めば、現在のプロセスのログイン・ユーザーIDを取得できます。 制御端末を持たないプロセスのIDを取得することは可能ですが、デーモン・プロセスのIDは4294967295かもしれません。
#!/bin/bash 
# A relatively reliable way to find process initiator on Linux 
user_entry=`getent passwd $(cat /proc/self/loginuid)` 
if [ $? -eq 0 ]; then 
     login_user=`echo ${user_entry} | cut -d: -f1` 
else 
     login_user=${SUDO_USER:-${LOGNAME}} 
     if [ "${login_user}" = "" ]; then 
          login_user=`id -urn` 
     fi 
fi 
echo ${login_user} 
Read next

マイクロソフト、Win8を無料にする時が来たようだ。

アナリストは今日、Win8は確かに業績不振ですが、大きな欠点は必ずしも新しいユーザーインターフェースではなく、その価格にあると述べています。ですから、マイクロソフトはアップルを見習って、より多くのユーザーを引き付けるためにWin8を全ユーザーに無料にすることを検討すべきです。

Nov 11, 2013 · 1 min read