命名会话

命名会话

在屏幕中运行命令并分离非常简单。

screen -S test -d -m echo "output of command that runs forever"

不过,我还想将所有输出通过管道传输到一个文件进行日志记录,如何在屏幕中运行以下内容并分离。

echo "output of command that runs forever" &> output.log

编辑:

只是为了澄清,我需要这个脚本,如此简单地启动屏幕并运行命令,并且分离不是一个选项。

答案1

您可以将命令包装在额外的bash(或实际的 shell)调用中并在那里进行重定向:

$ screen -dm bash -c 'echo hello > ./out'
$ cat ./out
hello

来自man screen

-d -m 以“分离”模式启动屏幕。这会创建一个新会话,但不会附加到它。这对于系统启动脚本很有用。

命名会话

可能适合为您的后台作业命名,以消除它们的歧义,screen -ls并在必要时附加:

$ screen -S mysession -dm sleep 20
$ screen -ls
8431.mysession  (10/04/2021 12:47:58 PM)    (Detached)

# attach
$ screen -r mysession

如何传递参数

但参数化可能会很麻烦。传递的参数bash$0-- 注意ignore_me_arg

# note the outer-most quotes to be single -- we don't want them to
# be expanded on the caller's side, but on the callee's one

$ screen -dm bash -c 'echo $1 > ./out' ignore_me_arg hello
$ cat ./out
hello

作为最后一个例子,假设您有一个程序super_script执行一些操作并将其所有参数打印到stdout(就像echo这样做的那样)。您想在 inside 中调用它screen,进行重定向,并使用不同的参数集完成所有这些爵士乐。那么这应该做:

$ screen -dm bash -c 'super_script "$@"  > ./out.1' arg0 arg1
$ screen -dm bash -c 'super_script "$@"  > ./out.2' arg0 arg1 arg2
... wait for screen's to finish
$ cat out.1
arg1
$ cat out.2
arg1
arg2

答案2

屏幕-dms工作区;屏幕 -S 工作区 -X stuff $'ps aux > 输出-x\n'

我首先使用 -d 开关创建一个独立的会话,我将其称为会话工作区。然后,我使用 -X 东西将命令发送到同一个会话,我使用 $'',但您也可以使用双引号,但必须执行控制 M 而不是 \n,我不喜欢这样,所以我通常使用我上面描述的方法。

这段代码运行后,您将找到带有进程列表的输出-x,并且如果您执行以下操作:

屏幕-ls

您将看到会话已被分离。

既然你说你要运行一个脚本。您可能希望让脚本搜索分离的会话(我正在使用工作区),如果存在,则将命令发送到该预先存在的会话,而不是每次运行“screen -dmS sessionName”时创建一个新会话,例如在下面:

    #!/bin/bash
    if ! ( screen -ls | grep workspace > /dev/null); then
       screen -dmS workspace;
    fi
    screen -S workspace -X stuff $'ps aux > output-x\n'

答案3

您可以使用disownnohup

用法: 如何在关闭 SSH 会话后监控 WGET 下载进度

相关内容