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



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

我试过使用这个:exec screen -dmS "alt-logging" /bin/bash "$0";。这有时会创建屏幕等,但其他时候什么都不会发生。当它创建一个屏幕时,它不会运行脚本文件的其余部分,当我尝试恢复屏幕时,会说它是(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 "$0";
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 < "$1"

以下是配置文件的内容:

# 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时,您将用屏幕的代码替换正在运行的脚本代码。

不过,您可以做的是启动屏幕,找出一些关于它的细节,并将控制台脚本重定向到它的输入/输出,但您将无法将运行的脚本恢复到屏幕进程,就像在那里启动一样。例如:

#!/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(从屏幕内获取脚本控制台可能会有所帮助。但更干净/更简单的方法是(在需要时(在屏幕会话建立后启动应该在该会话中执行的代码。

话虽如此。实际上,我建议退一步问,你们到底想实现什么,为什么要在屏幕上运行脚本。您是否计划将其连接/分离?因为如果您想要的是使用分离的控制台运行长期进程,那么nohup可能是一条更简单的路线。

相关内容

  • 没有找到相关文章

最新更新