systemd发起的Nodejs脚本无法与SVN通信

问题描述 投票:0回答:1

我有一个在Ubuntu上运行的Nodejs脚本,它充当HTTP服务器(使用Express),当对服务器进行特定的POST时,它将尝试使用以下代码登录SVN并执行svn info命令:

svn_info = ["info", server, "--xml", "--non-interactive", "--username", svn_username, "--password", svn_password, "--no-auth-cache"];
output = spawnSync("svn", svn_info, { encoding: 'utf8' });
logger.debug(output.output);

这完全可以作为使用命令行的独立脚本。执行nodejs app.js并发送相应的POST,结果如下(路径名等已经被方括号中的“标签”手动替换):

<?xml version="1.0" encoding="UTF-8"?>
<info>
    <entry path="my_path" revision="67368" kind="dir">
        <url>https://[svn_server]/[root_path]/[relative_path]/my_path</url>
        <relative-url>^/[relative_path]/my_path</relative-url>
        <repository>
            <root>https://[svn_server]/[root_path]</root>
            <uuid>[UUID]</uuid>
        </repository>
        <commit revision="67334">
            <author>author@domain</author>
            <date>2019-02-07T15:33:15.806240Z</date>
        </commit>
    </entry>
</info>

我的systemd脚本,test_server.service调用Nodejs脚本,如下所示:

[Unit]
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/nodejs /home/some_path/app.js

[Install]
WantedBy=multi-user.target

当脚本启动时,无论是通过启动还是service test_server start命令,并且发出了相同的POST命令,我在日志文件中看到以下内容:

[2019-02-08T15:25:19.251Z] debug: ,<?xml version="1.0" encoding="UTF-8"?>
<info>
,svn: E170013: Unable to connect to a repository at URL 'https://[svn_server]/[root_path]/[relative_path]/my_path'
svn: E000111: Error running context: Connection refused

该脚本以root用户身份运行,既可以从shell运行,也可以在systemd启动时运行。我正在努力理解当systemd执行脚本时会导致脚本失败的微妙差异。

javascript node.js svn systemd
1个回答
0
投票

tldr;

结果发现这与上面发布的代码无关。这是因为运行Web服务器的计算机与运行SVN服务器的计算机位于不同的网络上。这两个只允许通过代理进行通信,代理需要在~/.subversion/servers文件中设置。

更长的故事

以“user1”身份登录时,此用户已在~/.subversion/servers文件中正确设置了SVN代理服务器。针对SVN存储库运行sudo svn info工作,可能是因为正在使用相同的~/.subversion/servers文件。

如果我使用sudo -i(以“root”运行,所有环境变量设置为好像我以“root”身份登录),我发现,当使用svn info时,我确实得到了“拒绝连接”错误。

编辑~/.subversion/servers文件后使用正确的代理:

[global]
# http-proxy-exceptions = *.exception.com, www.internal-site.org
http-proxy-host = defaultproxy.whatever.com
http-proxy-port = 7000

一切都很完美!

© www.soinside.com 2019 - 2024. All rights reserved.