当需要类似 screen/tmux 的解决方案时会发生什么(让进程长时间运行,但不是因为nohup
可能需要交互) - 但 screen/tmux 在给定机器上不可用,并且安装 screen/compiling这不是一个解决方案吗?
问:是否有任何“短”perl 脚本可以普遍(或不普遍)用于实现此目标(在 Linux/AIX/等上)?
只需要这个:
- 启动perl脚本
- 开始需要很长时间的特定事情
- 从终端断开连接,例如:因为工作笔记本需要关闭
- 重新连接到控制台查看/控制启动的长时间运行的进程,就像在屏幕中一样
有人有这样的 perl 脚本吗?
答案1
perl
IO::Pty
除非安装了该模块,否则可能不是最合适的。
首先,如果给定的需要很长时间的东西(gtttlt)可以与管道一起正常工作,也许您不需要任何复杂的东西。
mkfifo input
nohup gtttlt <> input > output 2>&1 &
启动gtttlt
(从命名管道输入,输出到常规文件)。然后你附将其替换为:
tail -f output & cat > input
如果管道不起作用并且您需要一个终端,那么您可能需要使用可以启动伪终端的东西,例如expect
, zsh
s zpty
, perl
'sIO::Pty
或sshd
:
mkfifo input
nohup ssh -tt localhost gtttlt <> input > output 2>&1
并附:
stty raw -echo; tail -f output & cat > input
screen
请注意,这与实现or不同tmux
。screen
并tmux
实现一个终端模拟器。重新连接时,您会看到该终端模拟器的屏幕内容。在这里,当您重新附加时,您只能看到最后 10 行输出(尽管您可以通过向 传递选项-n 123
来进行调整tail
)。我们只是将所有数据传入/传出主机终端。
答案2
这并不完全是你所要求的,但我经常at
这样做。我经常从笔记本电脑上在远程服务器上启动命令,然后希望关闭笔记本电脑而不丢失命令的输出。at
允许我在给定时间启动作业,并且我只需将作业的输出和错误流重定向到文件。
例如,如果我想运行,my_script.pl
我将创建一个名为foo.txt
以下内容的小文件:
my_script.pl > out 2>er
然后运行它
$ at now < foo.txt
然后,我可以注销服务器,将笔记本电脑带回家,并通过ssh
登录服务器并运行来检查输出
$ tail -f er
或者
$ tail -f out
您还可以at
从其 shell 中提供作业(点击CtrlD退出):
$ at now
warning: commands will be executed using /bin/sh
at> my_script.pl > out 2>er
at> <EOT>
job 10 at Thu Sep 5 00:39:00 2013
答案3
作为上面“at”建议的替代方案,我更喜欢这个:
- 像平常一样启动你的 Perl 脚本“perl script.pl”
- 做用户交互的事情并进入需要很长时间的部分
- 按 ctrl+z 将其置于背景中并输入“bg”。该进程现在在后台运行
- 运行“jobs”来查看您的进程获得的数量。最有可能是1。
- 运行“disown %1”将程序与当前终端脱钩。
- 您现在可以安全地关闭终端(输入“exit”或只需按关闭按钮)
此外,您可以将输出重定向到文件或命名管道。不幸的是,我认为没有办法将进程再次附加到您的终端。