![使用 cron 在终端上启动进程而不使用屏幕?](https://linux22.com/image/68231/%E4%BD%BF%E7%94%A8%20cron%20%E5%9C%A8%E7%BB%88%E7%AB%AF%E4%B8%8A%E5%90%AF%E5%8A%A8%E8%BF%9B%E7%A8%8B%E8%80%8C%E4%B8%8D%E4%BD%BF%E7%94%A8%E5%B1%8F%E5%B9%95%EF%BC%9F.png)
我想使用 cron 在终端中启动一个进程。我希望该进程在终端中启动,以便我可以连续在终端上看到该进程的输出,并终止它/重新启动它等。我知道我可以通过屏幕执行此操作,方法是使用“screen -p -X东西”,但我最近遇到了屏幕冻结的奇怪问题(屏幕会话冻结,输出停止,但进程继续运行。可以回收屏幕吗?),并且想知道是否有一种方法可以在不使用屏幕的情况下通过终端中的 cron 启动进程?我可以预先创建终端并手动重命名等,以防有帮助。
答案1
这是一个解决方案,它将unlockpt()
一个新的 pty 描述符并将其写入ptsname()
标准输出。
<<\C cc -xc - -o pts
#include <stdio.h>
int main(int argc, char *argv[]) {
if(unlockpt(0)) return 2;
char *ptsname(int fd);
printf("%s\n",ptsname(0));
return argc - 1;
}
C
它只是编译一个微小的 C 程序,尝试调用unlockpt()
其 stdin,如果成功,则将新创建和解锁的 pty 的名称打印到,否则stdout
默默返回 2。
在 Linux 系统上 - 给予适当的权限(一般来说,这些都是通过将自己添加到tty
群组中最容易实现的)- 可以轻松获得新的 pty 描述符...
exec 3<>/dev/ptmx
...然后在当前 shell 中获取主端 fd,前提是您已在./
...中编译了上面的程序
slave=$(./pts <&3)
...将使您的新描述符实际可用,并将其设备名称放入 shell 变量的值中$slave
。
接下来,提供了util_linux
软件包已安装在您的系统上,您可以setsid()
在那里安装一个新进程,例如:
setsid -c sh 3>&- <>"$slave" >&0 2>&1
它将sh
作为 pty 的会话领导者启动一个交互式进程并退出,本质上是交互式 shell 的后台。后台 shell 会将写入的任何内容解释>&3
为用户输入。写一个特别有用的东西可能看起来像:
echo "exec >$(tty) 2>&1" |
cat - /dev/tty >&3
将后台 shell 及其子级的所有输出暂时重定向到当前终端,同时将所有键盘输入重定向回后台 shell,只要cat
存在即可。不过,后台 shell/dev/tty
是 Slave 中的 pty,因此恢复现状很容易,如下所示:
echo 'exec >/dev/tty 2>&1' >&3
同样的事情也可以从 进行cron
,但是当然,您可能只想编写 I/O 脚本,或者设置一些管道中继来自动为您完成这些工作。
看我如何获得这个 pty,我可以用它做什么?了解更多。