我正在尝试在我的服务器(CentOS 5.11)上创建一个新screen
服务器,但是为了安全起见,我不想用我的用户来启动它,而是宁愿使用另一个具有受限权限的用户。
因此,在了解了屏幕内脚本这看起来很容易:
sudo su - <user> bash
script /dev/null
screen -c .screenrc -d -m -S testN ping google.com
exit
一切运行正常。我甚至可以使用screen -x <user>/testN
(供 3 或 4 名机器用户使用)访问它。因此,一行中的所有内容应该是...
sudo su - <user> bash -c 'script -c "screen -c .screenrc -d -m -S testN ping google.com; exit;" /dev/null'
但是(现在)由于某种原因,当我这样做时sudo su - <user> bash -c 'screen -ls'
屏幕坏了,我无法像以前一样连接该屏幕。
屏幕上显示:24120.testN (死机???) 使用“screen -wipe”删除死机屏幕。
有人遇到过类似的问题吗?任何关于更简单方法的想法都会受到欢迎。
我的.screenrc
只是一个将屏幕设置为可供其他用户访问的配置,似乎与问题没有任何关系。
答案1
这是一个有趣的竞争条件。设置屏幕会话时,屏幕会分叉。父进程退出,子进程设置会话,运行命令等等。但是,在您的命令中,在父进程退出后,其整个祖先链都已完成并退出。在此过程中,控制终端关闭,这会SIGHUP
向前台进程组发送:唯一的进程是子屏幕进程。由于它还没有时间设置其信号处理,因此SIGHUP
执行的默认处理程序:进程退出。
子进程很可能总会输掉这场竞赛,因为它首先花时间进行多次文件系统访问来设置通信套接字,所有这些都是退出父母进程级联可以运行的中断点。
好消息是,如果您尝试启动它只是为了以交互方式连接到其他用户的会话,那么您使用的几乎所有命令行都是不必要的(“脚本”命令没有任何内容 - 您链接的问题提到了非特定的“问题”,但除非您有其中之一,否则不要对它进行货物崇拜;您也不需要“su - ”的东西,它设置的任何内容都不是初始屏幕过程所必需的,并且所有关心的内容都需要通过屏幕进行设置)。
sudo -u $OTHERUSER screen -c /path/to/screenrc -d -m -S testN ping google.com