gpt4 book ai didi

linux - 如果为真,则在新 screen 中运行脚本

转载 作者:太空狗 更新时间:2023-10-29 12:39:21 26 4
gpt4 key购买 nike

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

我试过使用这个:exec screen -dmS "alt-logging"/bin/bash "$0";。这有时会创建 screen 等,但有时什么也不会发生。当它创建一个 screen 时,它不会运行脚本文件的其余部分,当我尝试恢复 screen 时它说它是 (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您将正在运行的脚本代码替换为 screen 的代码。

虽然你可以做的是启动 screen ,找出关于它的一些细节并将你的控制台脚本输入/输出重定向到它,但是你将无法将正在运行的脚本重新设置为 screen 进程,就像从那里开始一样.例如:

#!/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 这样的第三方工具可能会有所帮助从 screen 内部获取脚本的控制台。但是更清晰/更简单的方法是(在需要时)启动应该在该 screen session 建立后执行的代码。

就是说。实际上,我建议退后一步,问问您到底想达到什么目的,以及为什么要在 screen 上运行您的脚本。您打算附加/分离它吗?因为如果使用分离控制台运行长期进程是您所追求的,nohup可能是一条更简单的路线。

关于linux - 如果为真,则在新 screen 中运行脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53739447/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com