Bash 脚本:创建一个屏幕会话并在其中执行命令

Bash 脚本:创建一个屏幕会话并在其中执行命令

我想编写一个 bash 文件,它启动一个屏幕会话并执行其中的命令。

问题是,它首先创建一个会话,当您手动退出会话时,它会执行下一个命令。有没有办法在会话内执行命令?

这是我到目前为止的代码:

#!/bin/bash
screen -S test
python3 test.py

答案1

您需要传递要在屏幕会话内运行的命令。您可以通过直接传递命令或调用运行您想要的任何命令的脚本来执行此操作。

screen -S test "python3 test.py"

如果您使用此方法,请注意命令(python)和传递给它的参数(test.py)都在语音标记“ .. ”内 - 如果您传递需要特定格式的语音标记的参数,这可能会变得复杂,然后使用下面的方法可能会更容易。

screen -S test bash -c "bash /home/user/test.sh"

其中 test.sh 位于 /home/user/ 中,是可执行文件 ( chmod +x ./test.py) 且包含:

#!/bin/sh
python3 test.py

第二种方法的优点是您可以在脚本中拥有任意数量的命令,它们将一个接一个地运行。

您可以通过使用任务的后台运行来“同时”运行多个命令:

#!/bin/sh
# All 3 will run at the same time
python3 test.py &
python3 test1.py &
python3 test2.py &

一些额外的巧妙技巧可以在SF 上的类似问题,最后要注意的是,使用所有这些方法,一旦程序/脚本退出,screen 会话本身就会关闭。如果您不希望它这样做,您可以考虑执行一个 bash 会话,它会调用脚本,然后返回到 bash 会话 - 就像这样screen -S test "someCommand; bash"

答案2

这可以通过 -X 参数实现。首先创建一个会话,然后发送命令来执行脚本:

$ echo "echo Hello world > /tmp/foo" > /tmp/myscript.sh; chmod a+x /tmp/myscript.sh
$ screen -S mysession -d -m bash
$ screen -r mysession -X stuff "/tmp/myscript.sh"$(echo -ne '\015')
$ cat /tmp/foo 
Hello world

“stuff” 命令模拟将文本粘贴到终端。echo 命令模拟按回车键。关于发送命令的优秀博客文章:https://theterminallife.com/sending-commands-into-a-screen-session/

答案3

下面的示例在执行脚本时运行代码,或者在屏幕会话中运行相同的代码./my_script.sh -s

# contents of my_script.sh:

if [ "$1" == "-s" ]; then
    screen "$0"
else
    # code
fi

相关内容