在屏幕中运行命令并分离非常简单。
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
您可以使用disown
或nohup