运行 如果为真,则在新屏幕中执行脚本
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_logging
为 false
时它工作得很好,所以 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
可能是更简单的方法。
我有一个脚本,它将检查 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_logging
为 false
时它工作得很好,所以 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
可能是更简单的方法。