从服务器管理员的角度来看,我对此更感兴趣,而不是开发人员。
作为一个真实世界的例子,假设我在ps aux中有一行显示:
usercom 1696 0.1 0.2 34104 4556 ? Ss 07:33 0:20 ./mail
这是perl脚本本身并不明显,但我可以通过执行“lsof -p 1696”来确定它(除了其他内容之外):
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
perl 1693 usercom txt REG 0,49 17326 99846241 /home/virtfs/usercom/usr/local/bin/perl
所以这告诉我这是一个在这个用户的perl解释器中运行的脚本(在openvz中)。
如果我查看此脚本的cwd,则会生成一个不包含“mail”可执行文件的目录。
问题有哪些技术可用于确定当前正在执行的perl代码的“来源”(从服务器管理员的角度来看)。我开始接受绝对没有办法绝对确定运行perl脚本的“源”,因为$ 0非常容易操作。另外,可以将代码管道输入perl或eval。尽管如此,有没有人知道跟踪perl脚本根目录的任何好方法?
答案 0 :(得分:0)
在'lsof'的输出中查找'cwd'(当前工作目录)行。
localhost proc # ps ax | grep test
4751 pts/18 S+ 0:00 sh test.sh
localhost proc # lsof +p 4751
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sh 4751 user cwd DIR 8,3 12288 4964356 /home/user
<CLIP>
localhost proc #
只是为了验证我移动了脚本并再次尝试了。
user@localhost ~ $ mv test.sh bin/
user@localhost ~ $ cd bin
user@localhost ~/bin $ sh test.sh
localhost proc # ps ax | grep test
4848 pts/18 S+ 0:00 sh test.sh
localhost proc # lsof +p 4848
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sh 4848 user cwd DIR 8,3 4096 4965757 /home/user/bin
<CLIP>
localhost proc #
如果您不想依赖'lsof',可以查看'/ proc / $ pid /'目录并查看'cwd'符号链接的位置:
localhost 4848 # ls -l
total 0
<CLIP>
lrwxrwxrwx 1 user user 0 Feb 13 18:51 cwd -> /home/user/bin
<CLIP>
localhost 4848 #
希望有帮助...
编辑:使用更改'$ 0'
的Perl脚本对此进行测试user@localhost ~/bin $ ./test.pl
localhost 4848 # ps ax | grep test
5004 pts/17 S+ 0:00 grep --colour=auto test
localhost 4848 # ps ax | grep bogus
5002 pts/18 S+ 0:00 bogus.pl
5006 pts/17 R+ 0:00 grep --colour=auto bogus
localhost 5002 # lsof +p 5002
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
test.pl 5002 user cwd DIR 8,3 4096 4965757 /home/user/bin
<CLIP>
localhost 5002 #
localhost ~ # cd /proc/5002/
localhost 5002 # ls -l
total 0
<CLIP>
lrwxrwxrwx 1 user user 0 Feb 13 19:12 cwd -> /home/user/bin
<CLIP>
文件'/ proc / $ pid / status'包含原始脚本名称:
localhost 5002 # cat status
Name: test.pl
<CLIP>
localhost 5002 #