我已经创建了一个screen
会话并在该会话中运行rsync
:
screen -S rsync_backup
rsync -rvnc data/ data2 >rsync_out-4.txt 2>rsync_outErr-4.txt
我使用top
命令进行进度监控,最初我在输出中看到了screen
和(玩具示例如下):rsync
top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1619 denis 20 0 170096 4644 0 S 0.0 0.0 0:00.00 rsync
1739 denis 20 0 7320 2828 2064 S 0.0 0.0 0:00.02 screen
过了一段时间, 不再出现rsync
,但screen
仍然出现在top
输出中:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1739 denis 20 0 7320 2828 2064 S 0.0 0.0 0:00.02 screen
我的问题是:
screen
当会话中运行的命令(rsync
在我的情况下)完成时,会话是否应该自动终止?- 典型
user
场景是否假设在screen
命令(例如rsync
)执行完成后强制手动终止会话?即:
screen -S rsync_backup
rsync -rvnc data/ data2 >rsync_out-4.txt 2>rsync_outErr-4.txt
screen -XS <session-id> quit
我不同意@ReflectYourCharacter 的回答。
当其中的命令完成后, screen 会话会自动终止。但是,如果您正在运行 shell,则 shell 就是命令。
例如,如果您输入:
将创建一个 screen 会话,其中一个窗口运行命令
sleep 5
。当此命令退出时,screen
退出。另一方面,如果您确实
screen -S somename
等待提示,并sleep 5
在该提示符下键入,则退出后 shell 仍在该窗口中运行sleep
并screen
继续。我建议以下之一:
screen
,在命令前加上exec
。这将导致命令替换 shell,因此命令退出时窗口和屏幕也会退出。
screen -S rsync_backup sh -c 'rsync -rvnc data/ data2 >rsync_out-4.txt 2>rsync_outErr-4.txt'
运行命令,然后 shell 将解析命令行和重定向。完成后,和 也将解析。请注意,如果您不使用,重定向将应用于屏幕输出,这不是您想要的。sh -c '...'
rsync
sh
screen
sh -c '...'
rsync
命令的脚本。然后在命令行上调用该命令screen
。该脚本无需使用sh -c '...'
,因为它提供了自己的 shell。视情况而定。如果屏幕由命令启动,则命令完成后它会关闭。
如果它运行交互式 shell,会话将保持打开状态直到手动退出。
screen -S test_session ./test
screen -S test_session -dm ./test
screen
由于交互式 shell 正在运行,因此保持打开状态screen -S test_session
exec
确保that
屏幕自动终止screen -S test_session -dm bash -c 'exec ./test'
如果您想测试屏幕会话是否仍然存在:
screen -ls
ps
ps aux | grep [s]creen
screen -r test_session
是的,在典型的使用情况下,当用户不再需要屏幕会话时,他们会手动关闭它。
您可以通过以下方式进行操作:
脚本执行完成后终止屏幕会话
screen -d -m "/path/to/that/script"
通过 bash 脚本关闭屏幕
Linux:一旦进程结束,就终止屏幕
脚本完成后退出屏幕
“screen -dm” 和 “screen -Dm” 有什么区别
使用 GNU screen 运行程序,然后立即分离