有时我想开始一个过程并忘记它。如果我从命令行启动它,就像这样:
redshift
Run Code Online (Sandbox Code Playgroud)
我无法关闭终端,否则它会终止进程。我可以以可以关闭终端而不终止进程的方式运行命令吗?
有时我在 gnome-terminal 中运行一个应用程序,但后来我突然不得不重新启动 gnome 或其他东西。我想这个问题的答案也很有用,然后我想在发生某些事情的地方与 SSH 断开连接。
Gnome 的终端树如下所示:
gnome-terminal
bash
some-boring-process
Run Code Online (Sandbox Code Playgroud)
我可以bash从gnome-terminal(或some-boring-process从 bash分离并将其输出重定向到某个地方)吗?如果我只是杀死gnome-terminal,bash将被杀死以将其所有子进程
我有一个如下所示的 bash 脚本:
##script
#!/bin/bash
rm data*
rm logfile*
for i in {1..30}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &
done
Run Code Online (Sandbox Code Playgroud)
我想在第一个循环之后创建另一个 for 循环以继续另一个 30。例如
##script
#!/bin/bash
rm data*
rm logfile*
for i in {1..30}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &
for i in {31..60}
do
## append a …Run Code Online (Sandbox Code Playgroud) 首先这个问题是相关的,但绝对不同于这个非常好的问题:
我想了解一些事情:当我做 '&' 时,我是在分叉吗?
做“nohup ... &”是否有用,或者只是&足够?
有人可以展示您使用“&”但仍想使用“nohup”的情况吗?
我看到这有这样的行为:
[root@divinity test]# echo 0 > file.txt
[root@divinity test]# cat file.txt
0
[root@divinity test]# echo 0> file.txt
[root@divinity test]# cat file.txt
Run Code Online (Sandbox Code Playgroud)
我还注意到,如果我包含"",那么它会按预期工作:
[root@divinity test]# echo 0""> file.txt
[root@divinity test]# cat file.txt
0
Run Code Online (Sandbox Code Playgroud)
我想这只是 IO 重定向的一部分,但我不太明白在echo 0>做什么。
我正在尝试构建一个流程容器。容器会触发其他程序。例如 - 使用 '&' 启动运行后台任务的 bash 脚本。
我所追求的重要特性是:当我杀死容器时,它下面产生的所有东西都应该被杀死。不仅是直系子女,还有他们的后代。
当我开始这个项目时,我错误地认为当你杀死一个进程时,它的孩子也会自动被杀死。我曾向有同样错误想法的人寻求建议。虽然有可能捕捉到信号并将杀戮传递给儿童,但这不是我在这里要寻找的。
我相信我想要实现的目标,因为当你关闭一个 xterm 时,它里面运行的任何东西都会被杀死,除非它被 nohup'd。这包括孤立进程。这就是我想要重新创建的。
我有一个想法,我正在寻找的内容涉及 unix 会话。
如果有一种可靠的方法来识别进程的所有后代,那么能够向它们发送任意信号也会很有用。例如SIGUSR1。
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) 得到两个命令 cmd1 和 cmd2。在这两者中,cmd2 需要更长的时间才能完成。需要先运行cmd2,然后再运行cmd1。
尝试以下列方式运行它们:
bash$ (nohup ./cmd2>result2 &) && nohup ./cmd1>result1 &
Run Code Online (Sandbox Code Playgroud)
或者
bash$ (nohup ./cmd2>result2 &) ; nohup ./cmd1>result1 &
Run Code Online (Sandbox Code Playgroud)
但是两次我都可以看到 cmd1 没有等待 cmd2 完成并且 result1 被填满。
当两者都应该是 nohup 进程并在后台运行时,如何让 cmd1 在 cmd2 之后运行?
这个问题很老了,我仍然不清楚为什么。
2014 年的原始问题:
在 Gnome 终端选项卡中,我跑了
$ nohup chromium-browser &
Run Code Online (Sandbox Code Playgroud)
但是当我关闭终端选项卡时,chromium-browser也会退出。不nohup应该阻止吗?吉尔斯说:
nohup 和 disown 都可以说是抑制 SIGHUP,只是方式不同。nohup 使程序最初忽略信号(程序可能会改变这一点)。nohup 还尝试安排程序没有控制终端,以便在终端关闭时内核不会向它发送 SIGHUP。disown 纯粹是 shell 内部的;它会导致 shell 在终止时不发送 SIGHUP。
那么 nohup 不是让铬浏览器忽略 SIGHUP 吗?
我也在其他可执行文件上看到了这一点,例如 Emacs(GUI 模式)。但不是在 xeyes 上。
发布问题时,这发生在 32 位 Ubuntu 12.04 上。
2015年更新,
现在我运行的是 Ubuntu 14.04,google-chrome而不是chromium-browser安装。以前发生在 Chrome 浏览器上的事情现在也发生在 google-chrome 上。nohup google-chrome 2>/dev/null &当终端选项卡关闭时,它不会被关闭。/usr/bin/google-chrome是一个指向 bash 脚本的链接/opt/google/chrome/google-chrome。为什么nohup应用于 bash 脚本不起作用?我们如何让它在 bash 脚本上工作?Python脚本呢?
我尝试通过远程会话启动一个 shell 脚本,它使用命令在后台启动一个进程。
nohup python3 run.py > nohup.out &
Run Code Online (Sandbox Code Playgroud)
当远程会话关闭时,进程会被以下消息杀死:
捕获信号SIGHUP
SIGHUP 被捕获但没有被守护。退出。
我不明白;为什么进程在使用nohup &在后台启动时被杀死?