屏幕中的for-Loop不起作用

时间:2018-01-22 16:06:33

标签: bash for-loop

我想在ssh会话中使用屏幕保持附加到循环命令,这很可能会运行几个小时。我正在使用屏幕,因为我担心在命令仍在运行时我的终端会断开连接。这是loop-command:

for i in *; do echo $i/share/sessions/*; done

echo将替换为rm -rf)。

我尝试了screen 'command ; command ; command'的多个变体,但从未让它发挥作用。我怎样才能解决这个问题?或者,你能为我的问题建议一个解决方法吗?

3 个答案:

答案 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 &