154

Windows 環境では、プロセスが実行されているパスを取得するための API があります。Unix / Linux に似たようなものはありますか?

または、これらの環境でそれを行う他の方法はありますか?

4

11 に答える 11

207

Linuxでは、シンボリックリンク/proc/<pid>/exeに実行可能ファイルのパスがあります。コマンドreadlink -f /proc/<pid>/exeを使用して値を取得します。

AIXでは、このファイルは存在しません。あなたは比較することができcksum <actual path to binary>ますcksum /proc/<pid>/object/a.out

于 2009-03-03T11:40:44.600 に答える
73

これらの方法でexeを簡単に見つけることができます。自分で試してみてください。

  • ll /proc/<PID>/exe
  • pwdx <PID>
  • lsof -p <PID> | grep cwd
于 2014-07-01T08:19:54.330 に答える
5

以下のコマンドは、実行中のプロセス リストでプロセスの名前を検索し、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

これがいつか誰かに役立つことを願っています.....

于 2019-01-25T12:58:32.163 に答える
4

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 
于 2009-03-03T11:41:17.377 に答える
3

「どこでも動作することが保証されている」方法はありません。

ステップ1は、argv [0]をチェックすることです。プログラムがフルパスで開始された場合、これは(通常)フルパスになります。相対パスで開始された場合も同じです(ただし、getcwd()を使用して現在の作業ディレクトリを取得する必要があります)。

ステップ2、上記のいずれにも当てはまらない場合は、プログラムの名前を取得し、次にargv [0]からプログラムの名前を取得し、環境からユーザーのPATHを取得して、適切なものがあるかどうかを確認します。同じ名前の実行可能バイナリ。

argv [0]はプログラムを実行するプロセスによって設定されるため、100%信頼できるわけではないことに注意してください。

于 2009-03-03T11:44:30.037 に答える
1

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);*/
于 2012-05-12T17:33:57.317 に答える
-1

プロセス名へのパスを見つける

#!/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
于 2011-10-28T15:10:09.573 に答える