之间有什么区别
$ nohup foo
Run Code Online (Sandbox Code Playgroud)
和
$ foo &
Run Code Online (Sandbox Code Playgroud)
和
$ foo &
$ disown
Run Code Online (Sandbox Code Playgroud) 我在 SSH shell 上有一个正在运行的程序。我想暂停它并在我回来时能够取消暂停它的执行。
我想到的一种方法是将其所有权转移到屏幕外壳,从而使其在那里运行。
是否有不同的方式进行?
我正在尝试从 bash 脚本中分离一个进程,以便在我退出脚本时不会将 SIGINT 转发到该进程。
我disown
直接在终端中使用了该命令,但是在 bash 中,disown
并没有阻止 SIGINT 被转发。此脚本的目的是通过一次调用启动 openocd,然后启动 gdb。由于脚本永远不会退出(它正在运行 gdb)SIGINT 仍然从 gdb 转发到 openocd,这是一个问题,因为 SIGINT 在 gdb 中用作停止命令。
在终端中,它看起来像这样:
$ openocd & # run openocd demonized
$ disown $! # disown last pid
$ gdb # invoke GDB
Run Code Online (Sandbox Code Playgroud)
按此顺序在终端上调用时,SIGINT 不会从 gdb 传递到 openocd。但是,如果在 bash 脚本中进行了相同的调用,则会传递 SIGINT。
任何帮助将不胜感激。
ps 这个问题是在 OS X 中,但我正在尝试使用也可移植到所有 Unix 工具的工具。
如果我关闭启动某个进程的虚拟终端,输出是直接转到/dev/null
,还是会以某种方式污染内存?
无论如何,我可以在此之后的任何时候获取输出以继续阅读吗?
[编辑]:那么,否认一个过程的那一刻是否有效地结束了我控制其输出的权力?
我还注意到,如果我否认一个停止的进程,起初一切似乎都很正常:它既不会终止,也不会显示在作业中。但是,如果我退出(并且我不是说关闭终端,只是从 退出su
,例如),该过程将终止。尽管如此,后台运行的被拒绝的进程可以保持运行。
disown
导致 shell 在 shell 终止时不向其不承认的作业发送 SIGHUP,并且
从 shell 的作业控制中删除被拒绝的作业。
第一个是第二个的结果吗?换句话说,如果从 shell 启动的进程以任何方式从 shell 的作业控制中删除,当 shell 终止时,shell 是否不会向该进程发送 SIGHUP?
disown -h
仍然使进程处于 shell 的作业控制之下。这是否意味着disown -h
使进程仍然接收来自shell发送的SIGHUP,但将进程的SIGHUP动作设置为“忽略”?这听起来类似于nohup
.
$ sleep 123 & disown -h
[1] 26103
$ jobs
[1]+ Running sleep 123 &
$ fg 1
sleep 123
$ ^Z
[1]+ Stopped sleep 125
$ bg 1
[1]+ sleep 123 &
$ exit
$ ps aux | grep sleep
t 26103 0.0 0.0 14584 824 ? S 15:19 0:00 …
Run Code Online (Sandbox Code Playgroud) 是否可以更改进程的父进程?如果是,如何?
例如,
如何screen
设法将会话screen
及其内部运行的进程附加到不同的 shell 进程?父进程有变化吗?
我似乎听说过其他更改程序运行的 shell 进程的方法,但我不记得了。程序的父进程是否也发生了变化?
我以为disown
在一个进程上改变了进程的父进程,只是因为名字disown
暗示了这一点。但我发现这不是真的。
Emacs 客户端可以在不同的终端选项卡上附加到 emacs 服务器。父进程有变化吗?
考虑一个由 Sh 执行的 shell 脚本,而不是 Bash(我不能改变它,也不能使用 shebang,它被忽略了)。该&
运营商的作品,但disown $!
不和使得嘘抱怨“不认:未找到”。
如何从特定的 Sh 中分离后台进程?我的意思是,从 Shdisown
做的和从 Bash做的一样。
我的拒绝前台进程的方法太费力了。
假设我在zsh
的前台有一个进程。我想要disown
它,这样我就可以关闭外壳,而不会向进程发送SIGHUP
.
目前,我从Ctrl+开始z到后台并暂停进程,然后
$ disown
disown: warning: job is suspended, use `kill -CONT -32240' to resume
$ kill -CONT -32240
$
Run Code Online (Sandbox Code Playgroud)
-然后我可以关闭终端。
我怎样才能自动化?理想情况下,我希望能够按Ctrl+j或其他东西来立即否认正在运行的进程。或者第二好的,我希望能够在SIGCONT
挂起后运行单个命令来拒绝和进程。
如果我找到disown
一份工作bash
并改变主意,我可以以某种方式撤消它吗?
如果是这样,更进一步,是否可以将任意流程置于作业控制之下(可接受的限制是我拥有该流程)?
最后,这是否会使以下工作流程成为可能:
^z
后跟bg
)jobs -p %+
获取它的<pid>
)screen
或tmux
会话,附加到它并将其用于以下步骤reptyr
抢的作业(reptyr <pid>
)<pid>
到 shell 的作业控制(这可能吗?)^Z
)除了最后两步,我什么都能做。停止作业^Z
不起作用,因为该进程不在 shell 的作业列表中。
我的研究表明不可能拥有(反向disown
)一个 pid 但希望我错了......
今天是星期天,我把 R 的一个实例留在了办公室里。脚本运行完毕,我想在不去办公室的情况下保存我的工作区。我可以通过 ssh 连接到计算机,但我还没有在屏幕上运行该程序。
有没有办法通过 ssh 否认该进程(我无权访问程序正在运行的终端的 jobsid!)并使用 reptyr 重新附加它?Reptyr 和 reptyr -T 在没有事先否认该过程的情况下不起作用
28845 3diag 20 0 139.3m 10.4m 0.0 0.1 0:12.06 S `- urxvtd
5327 3diag 20 0 16.4m 4.6m 0.0 0.1 0:00.02 S `- bash
5335 3diag 20 0 3499.3m 3.244g 0.0 43.3 171:57.89 S `- R
Run Code Online (Sandbox Code Playgroud)
我的问题的独特部分是我明确要求在无法访问创建程序的终端的情况下分离程序。