【问题标题】:Spawn Perl script as a process with particular name将 Perl 脚本生成为具有特定名称的进程
【发布时间】:2012-04-03 22:00:12
【问题描述】:

我需要一个 Perl 脚本来生成具有任意名称的自身,即,以便 操作系统的其余部分 将其视为例如“aaa.exe”。我的印象是在 Perl 中可以做到这一点,但现在我不确定了。

我在 Windows 7 amd64 上使用 Strawberry Perl 5.14,32 位版本。

这是我尝试过但不起作用的方法:

#!perl -w
# spawnself.pl

if ($ARGV[0]) {
    my $name = ($ARGV[0]);
    system {"perl"} $name, $0;
} else {
    print "running as $^X, PID is $$\n";
    print "press Enter to quit...\n";
    my $trash = <>;
}

我根据来自exec perldoc page(系统页面链接那里)的示例编写了这个:exec {'/bin/csh'} '-sh';,其中,IIUC,目标是让 /bin/csh 认为它是“-sh”,虽然我不是确定这是否也应该使 csh 从外部看起来像“-sh”。另外,这是 UNIX 示例,而我在 Windows 上。

我想要一个脚本,它以spawnself.pl aaa.exe 运行(从命令行)会自行生成,打印running as aaa.exe, PID is 1234,然后查看任务管理器会将此程序显示为“aaa.exe”。但是,我的 sn-p 以及世界其他人仍然认为自己是“perl.exe”:

  • 在任务管理器中,进程 1234 仍然被命名为“perl.exe”,所以它会打印出来
    running as C:\path\to\my\perl.exe, PID is 1234

我做错了什么?有人可以解释一下吗?

【问题讨论】:

  • 经过一番研究,我发现了running as spawnper.pl的问题——我误解了$0,我正在编辑Q以过滤掉这个问题

标签: windows perl exec


【解决方案1】:

我发现了一个非常丑陋但有效的黑客:

#!perl -w
#spawnself-ugly.pl

use File::Copy;

if ($ARGV[0]) {
    my $name = ($ARGV[0]);
    copy($^X, $name);
    my @args = ($name, $0);
    system @args;
} else {
    print "running as $^X, PID is $$\n";
    print "press Enter to quit...\n";
    my $trash = <>;
}

我实际上复制了一个 perl.exe 并运行了那个,所以最后我只是正在运行“aaa.exe”,所以没有必要对任何事情撒谎。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多