运行 如果为真,则在新屏幕中执行脚本

Run script in a new screen if true

我有一个脚本,它将检查 background_logging 是否为 true,如果是,那么我希望脚本的其余部分在新的分离屏幕中 运行。

我试过使用这个:exec screen -dmS "alt-logging" /bin/bash "[=15=]";。这有时会创建屏幕等,但有时什么也不会发生。当它创建一个屏幕时,它不会 运行 脚本文件的其余部分,当我尝试恢复屏幕时它说它是 (Dead??).

这是整个脚本,我添加了一些注释以更好地解释我想做什么:

#!/bin/bash

# Configuration files
config='config.cfg'
source "$config"

# If this is true, run the rest of the script in a new screen.
# $background_logging comes from the configuration file declared above (config).
if [ $background_logging == "true" ]; then
    exec screen -dmS "alt-logging" /bin/bash "[=11=]";
fi

[ $# -eq 0 ] && { echo -e "\nERROR: You must specify an alt file!"; exit 1; }

# Logging script
y=0
while IFS='' read -r line || [[ -n "$line" ]]; do
    cmd="screen -dmS alt$y bash -c 'exec $line;'"
    eval $cmd
    sleep $logging_speed
    y=$(( $y + 1 ))
done < ""

配置文件内容如下:

# This is the speed at which alts will be logged, set to 0 for fast launch.
logging_speed=5
# This is to make a new screen in which the script will run.
background_logging=true

此脚本的目的是遍历文本文件中的每一行并将该行作为命令执行。当 $background_loggingfalse 时它工作得很好,所以 while 循环没有问题。

如上所述,这并非完全可能。具体来说,您的脚本中发生了什么:当您 exec 时,您将 运行ning 脚本代码替换为屏幕代码。

虽然你可以做的是启动屏幕,弄清楚它的一些细节并将你的控制台脚本 in/output 重定向到它,但是你将无法重新设置你的 运行ning脚本到屏幕进程,就好像从那里开始一样。例如:

#!/bin/bash

# Use a temp file to pass cat's parent pid out of screen.
tempfile=$(tempfile)
screen -dmS 'alt-logging' /bin/bash -c "echo $$ > \"${tempfile}\" && /bin/cat"

# Wait to receive that information on the outside (it may not be available
# immediately).
while [[ -z "${child_cat_pid}" ]] ; do
        child_cat_pid=$(cat "${tempfile}")
done

# point stdin/out/err of the current shell (rest of the script) to that cat
# child process

exec 0< /proc/${child_cat_pid}/fd/0
exec 1> /proc/${child_cat_pid}/fd/1
exec 2> /proc/${child_cat_pid}/fd/2

# Rest of the script
i=0
while true ; do
    echo $((i++))
    sleep 1
done

远非完美而且相当混乱。使用像 reptyr 这样的第三方工具从屏幕内部获取脚本的控制台可能会有所帮助。但是 cleaner/simpler 还可以(在需要时)启动应该在该屏幕会话建立后执行的代码。

话虽如此。实际上,我建议退后一步,问问您到底想达到什么目的,以及为什么要 运行 在屏幕上显示您的脚本。你打算attach/detachto/from吗?因为如果 运行 将长期进程与分离的控制台结合起来是您所追求的,nohup 可能是更简单的方法。