从Java tomcat执行Perl脚本返回255个退出代码

时间:2016-04-25 08:22:23

标签: java perl ssh

我遇到了问题,我试图执行在另一台服务器上分配的PERL脚本。如果我在Linux Shell中执行该命令,脚本将正确运行。如果我执行脚本在apache Tomcat的同一服务器中分配perl脚本,运行正常,但是当我尝试通过Tomcat通过ssh执行脚本时,总是以错误代码255结束。

Perl脚本:

void clicked()
{
    TableId promptTableId;

    Dialog d;
    DialogField df;

    void createLine(DatabaseLogType logType)
    {
        DatabaseLog.logTable = promptTableId;
        DatabaseLog.LogType = logType;

        DatabaseLog.insert();
    }

    d = new Dialog("Enter table name");
    df = d.addField(extendedTypeStr(TableName));
    d.parmIsModal(true);

    if (d.run())
    {
        promptTableId = tableName2id(df.value());
        if (!promptTableId)
        {
             throw error(strFmt("Table %1 does not exists", df.value()));
        }

        ttsBegin;
        createLine(DatabaseLogType::Insert);
        createLine(DatabaseLogType::Update);
        createLine(DatabaseLogType::Delete);
        ttsCommit;

        SysFlushDatabaseLogSetup::main();

        info(strFmt("For table %1 (%2) records are created: %3, %4, %5."
            , tableId2name(promptTableId)
            , tableId2pname(promptTableId)
            , DatabaseLogType::Insert
            , DatabaseLogType::Update
            , DatabaseLogType::Delete
        ));
    }

    super();
}

现在,这是Java文件中的代码

#!/usr/bin/perl
my $sleeptime = 10;
sleep($sleeptime);

my $argumento=$ARGV[0];
if ( $argumento eq "A" ) {
    exit 0;
} else {
    exit 192;
}

如果我将命令变量更改为

String command = "ssh root@myserver.com '/usr/bin/perl /var/www/testPerl.pl A'";
process = Runtime.getRuntime().exec(command);
process.waitFor();  
if ( process.exitValue() == 0 ) {
    System.out.println("Show icon ok");
} else {
    System.out.println("Show error");
}

返回代码正常(0或192)

必须远程执行,因此我无法将真正的PERL复制到tomcat目录。我做的只是为了测试。

1 个答案:

答案 0 :(得分:1)

您是否尝试从Tomcat服务器作为tomcat用户进行SSH调用,例如

ssh root@myserver.com '/usr/bin/perl /var/www/testPerl.pl A'

尝试将 -v 添加为ssh参数并捕获输出以查看ssh连接是否正常工作。也许你错过了RSAAuthentication(基于密钥而不是基于密码)或其他不能正常工作的东西。

尝试从Perl返回一些值进行调试:

print "I'm running (STDOUT)\n";
print STDERR "I'm running (STDERR)\n";