2

我有一个 .sh 脚本,它粘合了许多其他脚本,由 Windows 应用程序中的 jsch ChannelExec 调用。

Channel channel = session.openChannel("exec");

((ChannelExec) channel).setCommand("/foo/bar/foobar.sh");

channel.connect();

如果我运行“nohup /foo/bar/foobar.sh >> /path/to/foo.log &”之类的命令,所有长期作业(数据库操作、文件处理等)似乎都会丢失。

检查日志文件,只找到那些回显的东西(长期操作之前和之后,计算运行时间等)。

我检查了权限 $PATH,将源 /etc/profile 添加到我的 .sh 中,但这些都不起作用。

但是当我正常运行命令时(同步运行,将所有回显输出打印到 Windows 上的 java 客户端),一切顺利。

这是一个非常具体的问题。希望有经验的人能帮帮我。

预先感谢。

4

1 回答 1

6

解决了!

在这种情况下经常出现的另一个问题是 ssh 拒绝注销(“挂起”),因为它拒绝从后台作业丢失任何数据。[6][7] 这个问题也可以通过重定向所有三个 I/O 流来解决。

来自 http://en.wikipedia.org/wiki/Nohup

我的问题是, psql 和 pg_bulkload 将它们的输出打印到错误流。

在我的脚本中,我没有重定向错误流。

通过将错误流重定向到同一个日志文件,一切都很好。

nohup foo.sh > log.log 2>&1 &

感谢 Atsuhiko Yamanaka,他创建了一个很棒的JSch 库,以及 Paŭlo Ebermann 的文档

于 2011-06-08T04:13:25.023 回答