0

如何在不使用 crontab 的情况下在后台连续运行脚本。即使在我注销后脚本也应该运行,并且如果它在系统重新启动后没有启动是可以接受的。我是 unix 新手。

4

5 回答 5

4

有几种方法可以做到这一点,但最简洁的方法是使用screen。这使您可以创建一个永久存在于机器上的会话,您可以简单地重新连接以检查长期运行过程的进度。

如果您不想使用screen,可以使用nohup它来运行以下任务:

nohup mytask &

您的任务现在将在后台运行,并且将在注销后继续存在,但是与screen.

于 2012-05-04T08:22:59.840 回答
2
if [ "x$1" != "x--" ]; then
$0 -- 1> /dev/null 2> /dev/null &
exit 0
fi

这就是您可以将脚本作为守护进程运行的方式。首先,您的脚本(父亲)将创建他自己(孩子)的副本,因此它被视为父亲的过程。然后父亲在孩子还在奔跑的时候自杀了。猜猜当你做这样的事情时会发生什么?子进程附加到 init 进程。因此,即使您注销,脚本仍然会运行。您甚至可以在没有“&”运算符的情况下启动它,因为您启动的父亲会在一毫秒后被杀死。
您可以再次控制它,就像在您的计算机上运行的任何程序一样。

顺便说一句,它不是一个真正的“守护进程”程序,它只是一种模拟。如果你想在登录时启动它,你不能只在启动时启动它(我的意思是真正的启动而不是登录),很简单把它放在你的.xinitrc

此解决方案的主要优点是您的脚本不依赖于任何其他程序,例如“nohup”,我认为这真的很糟糕。

问候
PS:如果您想了解有关上述命令的作用的一些信息,请问我。这只是一个“参数”的东西。

于 2012-05-04T09:56:41.417 回答
2

正如其他人之前提到的,您需要使用 nohup 来防止进程获得挂断信号(因此 no-h-up)。

但是,如果您在后台启动该进程以开始,如

prompt> nohup process &

这样做的缺点是不允许您输入启动该过程可能需要的任何数据。这可能是密码/凭证或过程需要的其他输入。

如果您有此要求,请在末尾不带“&”的情况下启动它,输入您的输入,然后按 Ctrl-Z 使进程进入睡眠状态。要将其发送到后台,请在提示符处键入“bg”并按 Enter。

prompt> nohup process
Enter password:
(Now press Ctrl-Z)
[1]+  Stopped                 process
prompt> bg
[1]+ process &

现在,即使您注销,该进程也将继续在后台运行。

或者,如果您使用的是 bash 或 zsh,如果您没有使用 nohup 启动该进程,并且无法杀死它并重新启动,那么您可以使用内置的 disown 命令。首先暂停和后台进程。然后阻止挂断信号到达它。

prompt> process
Enter password:
(Now press Ctrl-Z)
[1]+  Stopped                 process
prompt> bg
[1]+ process &
prompt> disown -h

注意:如果您正在运行其他后台作业,则需要提供作业规范以仅拒绝此特定作业。

prompt> disown -h %1

如果您在暂停并将进程发送到后台时看到 [2],而不是 [1],您会说disown -h %2

于 2012-05-04T11:25:44.090 回答
1

除了在后台启动它,如上所述,您可能需要使用“nohup”。这意味着即使您关闭终端,它也会继续运行。

nohup ./abc.sh &

于 2012-05-04T08:27:18.973 回答
-1

使用 & 运算符在后台启动它,例如

./abc.sh & 这将一直持续到 (a) 执行完成或 (b) 你杀死它或 (c) 系统重新启动

于 2012-05-04T08:22:20.540 回答