Windows 環境では、プロセスが実行されているパスを取得するための API があります。Unix / Linux に似たようなものはありますか?
または、これらの環境でそれを行う他の方法はありますか?
Windows 環境では、プロセスが実行されているパスを取得するための API があります。Unix / Linux に似たようなものはありますか?
または、これらの環境でそれを行う他の方法はありますか?
Linuxでは、シンボリックリンク/proc/<pid>/exe
に実行可能ファイルのパスがあります。コマンドreadlink -f /proc/<pid>/exe
を使用して値を取得します。
AIXでは、このファイルは存在しません。あなたは比較することができcksum <actual path to binary>
ますcksum /proc/<pid>/object/a.out
。
これらの方法でexeを簡単に見つけることができます。自分で試してみてください。
ll /proc/<PID>/exe
pwdx <PID>
lsof -p <PID> | grep cwd
以下のコマンドは、実行中のプロセス リストでプロセスの名前を検索し、pid を pwdx コマンドにリダイレクトしてプロセスの場所を見つけます。
ps -ef | grep "abc" |grep -v grep| awk '{print $2}' | xargs pwdx
「abc」を特定のパターンに置き換えます。
または、.bashrc で関数として設定できる場合は、これを頻繁に使用する必要がある場合に便利です。
ps1() { ps -ef | grep "$1" |grep -v grep| awk '{print $2}' | xargs pwdx; }
例:
[admin@myserver:/home2/Avro/AvroGen]$ ps1 nifi
18404: /home2/Avro/NIFI
これがいつか誰かに役立つことを願っています.....
Linuxでは、すべてのプロセスに独自のフォルダがあります/proc
。したがってgetpid()
、実行中のプロセスのpidを取得し、それをパスと結合して、/proc
必要なフォルダーを取得するために使用できます。
Pythonの簡単な例を次に示します。
import os
print os.path.join('/proc', str(os.getpid()))
ANSICの例も次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int
main(int argc, char **argv)
{
pid_t pid = getpid();
fprintf(stdout, "Path to current process: '/proc/%d/'\n", (int)pid);
return EXIT_SUCCESS;
}
コンパイル:
gcc -Wall -Werror -g -ansi -pedantic process_path.c -oprocess_path
「どこでも動作することが保証されている」方法はありません。
ステップ1は、argv [0]をチェックすることです。プログラムがフルパスで開始された場合、これは(通常)フルパスになります。相対パスで開始された場合も同じです(ただし、getcwd()を使用して現在の作業ディレクトリを取得する必要があります)。
ステップ2、上記のいずれにも当てはまらない場合は、プログラムの名前を取得し、次にargv [0]からプログラムの名前を取得し、環境からユーザーのPATHを取得して、適切なものがあるかどうかを確認します。同じ名前の実行可能バイナリ。
argv [0]はプログラムを実行するプロセスによって設定されるため、100%信頼できるわけではないことに注意してください。
GNU/Linux でパスを取得することもできます (十分にテストされていません):
char file[32];
char buf[64];
pid_t pid = getpid();
sprintf(file, "/proc/%i/cmdline", pid);
FILE *f = fopen(file, "r");
fgets(buf, 64, f);
fclose(f);
おそらく作業ディレクトリをプロセスのディレクトリ (media/data/etc 用) に変更するために実行可能ファイルのディレクトリが必要な場合は、最後の /: の後のすべてを削除する必要があります。
*strrchr(buf, '/') = '\0';
/*chdir(buf);*/
プロセス名へのパスを見つける
#!/bin/bash
# @author Lukas Gottschall
PID=`ps aux | grep precessname | grep -v grep | awk '{ print $2 }'`
PATH=`ls -ald --color=never /proc/$PID/exe | awk '{ print $10 }'`
echo $PATH