जवाबों:
आप इन तरीकों से आसानी से निर्वासन पा सकते हैं, बस इसे स्वयं आज़माएं।
ll /proc/<PID>/exe
pwdx <PID>
lsof -p <PID> | grep cwd
pwdx <PID>
मुझे प्रतीकात्मक लिंक का स्थान दिया, ताकि मैं लॉग को ढूंढ सकूं और उचित तरीके से प्रक्रिया को रोक सकूं।
ll
आमतौर पर एक उपनाम है alias ll='ls -alF'
:।
थोड़ा देर से, लेकिन सभी जवाब लिनक्स के लिए विशिष्ट थे।
यदि आपको भी यूनिक्स की आवश्यकता है, तो आपको इसकी आवश्यकता है:
char * getExecPath (char * path,size_t dest_len, char * argv0)
{
char * baseName = NULL;
char * systemPath = NULL;
char * candidateDir = NULL;
/* the easiest case: we are in linux */
size_t buff_len;
if (buff_len = readlink ("/proc/self/exe", path, dest_len - 1) != -1)
{
path [buff_len] = '\0';
dirname (path);
strcat (path, "/");
return path;
}
/* Ups... not in linux, no guarantee */
/* check if we have something like execve("foobar", NULL, NULL) */
if (argv0 == NULL)
{
/* we surrender and give current path instead */
if (getcwd (path, dest_len) == NULL) return NULL;
strcat (path, "/");
return path;
}
/* argv[0] */
/* if dest_len < PATH_MAX may cause buffer overflow */
if ((realpath (argv0, path)) && (!access (path, F_OK)))
{
dirname (path);
strcat (path, "/");
return path;
}
/* Current path */
baseName = basename (argv0);
if (getcwd (path, dest_len - strlen (baseName) - 1) == NULL)
return NULL;
strcat (path, "/");
strcat (path, baseName);
if (access (path, F_OK) == 0)
{
dirname (path);
strcat (path, "/");
return path;
}
/* Try the PATH. */
systemPath = getenv ("PATH");
if (systemPath != NULL)
{
dest_len--;
systemPath = strdup (systemPath);
for (candidateDir = strtok (systemPath, ":"); candidateDir != NULL; candidateDir = strtok (NULL, ":"))
{
strncpy (path, candidateDir, dest_len);
strncat (path, "/", dest_len);
strncat (path, baseName, dest_len);
if (access(path, F_OK) == 0)
{
free (systemPath);
dirname (path);
strcat (path, "/");
return path;
}
}
free(systemPath);
dest_len++;
}
/* again someone has use execve: we dont knowe the executable name; we surrender and give instead current path */
if (getcwd (path, dest_len - 1) == NULL) return NULL;
strcat (path, "/");
return path;
}
संपादित: बग मार्क lakata द्वारा रिपोर्ट फिक्स्ड।
"/proc/self/exe"
के साथsprintf(foo,"/proc/%d/exe",pid)
मैं उपयोग करता हूं:
ps -ef | grep 786
786 को अपने PID या प्रक्रिया के नाम से बदलें।
लिनक्स में हर प्रक्रिया का अपना एक फोल्डर होता है /proc
। इसलिए आप getpid()
रनिंग प्रक्रिया की सहायता प्राप्त करने के लिए उपयोग कर सकते हैं और फिर उस पथ /proc
से जुड़ सकते हैं जिस फ़ोल्डर की आपको उम्मीद है।
यहाँ पायथन में एक छोटा उदाहरण दिया गया है:
import os
print os.path.join('/proc', str(os.getpid()))
यहां एएनएसआई सी में उदाहरण दिया गया है:
#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] से प्रोग्राम का नाम प्राप्त करें, फिर उपयोगकर्ता के पर्यावरण से पाएं और देखें कि क्या कोई उपयुक्त है एक ही नाम के साथ निष्पादन योग्य बाइनरी।
ध्यान दें कि argv [0] प्रोग्राम को निष्पादित करने वाली प्रक्रिया द्वारा निर्धारित किया गया है, इसलिए यह 100% विश्वसनीय नहीं है।
धन्यवाद:
Kiwy
AIX के साथ:
getPathByPid()
{
if [[ -e /proc/$1/object/a.out ]]; then
inode=`ls -i /proc/$1/object/a.out 2>/dev/null | awk '{print $1}'`
if [[ $? -eq 0 ]]; then
strnode=${inode}"$"
strNum=`ls -li /proc/$1/object/ 2>/dev/null | grep $strnode | awk '{print $NF}' | grep "[0-9]\{1,\}\.[0-9]\{1,\}\."`
if [[ $? -eq 0 ]]; then
# jfs2.10.6.5869
n1=`echo $strNum|awk -F"." '{print $2}'`
n2=`echo $strNum|awk -F"." '{print $3}'`
# brw-rw---- 1 root system 10, 6 Aug 23 2013 hd9var
strexp="^b.*"$n1,"[[:space:]]\{1,\}"$n2"[[:space:]]\{1,\}.*$" # "^b.*10, \{1,\}5 \{1,\}.*$"
strdf=`ls -l /dev/ | grep $strexp | awk '{print $NF}'`
if [[ $? -eq 0 ]]; then
strMpath=`df | grep $strdf | awk '{print $NF}'`
if [[ $? -eq 0 ]]; then
find $strMpath -inum $inode 2>/dev/null
if [[ $? -eq 0 ]]; then
return 0
fi
fi
fi
fi
fi
fi
return 1
}
आप जीएनयू / लिनक्स पर भी पथ प्राप्त कर सकते हैं (पूरी तरह से परीक्षण नहीं किया गया है):
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);
यदि आप कार्यशील निर्देशिका को प्रक्रिया की निर्देशिका (मीडिया / डेटा / आदि के लिए) में बदलने के लिए निष्पादन योग्य की निर्देशिका चाहते हैं, तो आपको अंतिम / के बाद सब कुछ छोड़ने की आवश्यकता है:
*strrchr(buf, '/') = '\0';
/*chdir(buf);*/
नीचे दी गई कमांड चल रही प्रक्रिया सूची में नाम के लिए खोज करती है, और प्रक्रिया के स्थान का पता लगाने के लिए pwdx कमांड पर रीडायरेक्ट करती है।
ps -ef | grep "abc" |grep -v grep| awk '{print $2}' | xargs pwdx
अपने विशिष्ट पैटर्न के साथ "एबीसी" को बदलें।
वैकल्पिक रूप से, यदि आप इसे .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
उम्मीद है कि यह किसी को मदद करता है .....
प्रक्रिया नाम के लिए पथ खोजें
#!/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
pgrep
); अगली पंक्ति में इसे बाइनरी के निष्पादित होने का मार्ग मिलता है ( /proc/$PID/exe
यह निष्पादन योग्य फ़ाइल के लिए एक सिमलिंक है); और अंत में यह उस सहानुभूति को ग्रहण करता है।
sudo
यदि आउटपुट खाली है, तो कुछ सिस्टम अन्य सिस्टम उपयोगकर्ताओं द्वारा बनाए जाते हैं।