如何从命令行与控制终端分离?

Omn*_*ous 4 linux bash job-control

我知道nohup并且它不会做我想要的:

例子:

$ nohup sleep 600 2>/dev/null >/dev/null </dev/null&
[1] 21844
$ ps -ef | fgrep -e 'sleep
> TTY'
UID        PID  PPID  C STIME TTY          TIME CMD
me       21844 19313  0 09:37 pts/9    00:00:00 sleep 600
Run Code Online (Sandbox Code Playgroud)

如您所见,睡眠仍然pts/9作为控制终端。我不希望它有任何控制终端。部分是因为我想使用的程序(sleep如果你没有猜到就不是)试图打开控制终端来问我问题,如果不能,我想看看它的行为。我该如何做到这一点?

Omn*_*ous 5

setsidLinux 上的实用程序可以做到这一点。在 Fedora 上,它是util-linux软件包的一部分。这是包含之类相同的包mountmkfs/usr/bin/kill,和其他类似的东西。


Jim*_* L. 1

这是一个 FreeBSD 解决方案,但也许类似的技术也适用于您的操作系统。

我知道 cron 并不完全是命令行,但如果您有要运行的特定命令列表,cron 可以做到这一点。您可能希望避免 cron 重复运行该作业,也许可以通过围绕所需的命令列表制作一个包装器,例如:

#!/bin/sh
[ -f /tmp/my-semaphore-file ] || {
  touch /tmp/my-semaphore-file
  my_command_stack > /dev/null 2>&1
}
Run Code Online (Sandbox Code Playgroud)

对于生产用途来说可能不太优雅,但如果您只想测试命令堆栈在没有控制终端的情况下的执行情况,那就可以了。包装器将不允许 cron 再次运行该命令,直到您:

rm /tmp/my-semaphore-file
Run Code Online (Sandbox Code Playgroud)

at(1)也是一个选项,并且“几乎”是一个命令行解决方案:

echo 'my_command_stack > /dev/null 2>&1' | at now+1 minute
Run Code Online (Sandbox Code Playgroud)