我想在ssh会话中使用屏幕保持附加到循环命令,这很可能会运行几个小时。我正在使用屏幕,因为我担心在命令仍在运行时我的终端会断开连接。这是loop-command:
for i in *; do echo $i/share/sessions/*; done
(echo
将替换为rm -rf
)。
我尝试了screen 'command ; command ; command'
的多个变体,但从未让它发挥作用。我怎样才能解决这个问题?或者,你能为我的问题建议一个解决方法吗?
答案 0 :(得分:0)
我假设您正在尝试运行:
screen 'for i in *; do echo $i/share/sessions/* ; done'
这导致Cannot exec [your-command-here]: No such file or directory
,因为屏幕不会隐式启动shell;相反,它调用execv
- 系列调用来直接调用其参数中指定的程序。没有名为for i in *; do echo $i/share/sessions/*; done
的程序,并且没有运行shell可能将其解释为脚本,因此失败。
但是,您可以显式启动shell:
screen bash -c 'for i in *; do echo $i/share/sessions/* ; done'
顺便说一句 - 为每个要删除的文件运行一份rm
的副本效率会非常低。考虑使用xargs
生成尽可能少的实例:
# avoid needing to quote and escape the code to run by encapsulating it in a function
screenfunc() { printf '%s\0' */share/sessions/* | xargs -0 rm -rf; }
export -f screenfunc # ...and exporting that function so subprocesses can access it.
screen bash -c screenfunc
答案 1 :(得分:0)
长时间运行命令的屏幕可以像这样使用:
$screen -S session_name
//Inside screen session
$ <run long running command>
$ //press key combination - Ctrl + a + d - to come out of screen session
// Outside screen session
// Attach to previously created session
$screen -x session_name
有关详细信息,请查看屏幕的手册页。 另一种工作方式类似且非常受欢迎的应用是tmux
答案 2 :(得分:0)
这里不需要screen
。
nohup rm -vrf */share/sessions/* >rm.out 2>&1 &
将在后台运行命令,输出到rm.out
。我添加了-v
选项,因此您可以通过检查输出文件的tail
来更详细地了解它的功能。请注意,由于缓冲,文件不会完全实时更新。
另一个复杂因素是调用shell在设置此作业时将使用通配符执行大量工作。您也可以将其委托给子shell:
nohup sh -c 'rm -rvf */share/sessions/*' >rm.out 2>&1 &