Windows 下对应 nohup &的命令是什么?

2022-04-12 13:37:42 +08:00
 dcsuibian

最近在做的一个项目,Spring Boot 程序,基本上就是java -jar XXX.jar --spring.profiles.active=production ...这么运行。

本地开发机是 mac ,安装了 pwsh 。

程序部署在多台 windows ltsc 2018+虚机上。目前各种依赖环境已经装好,安装了 OpenSSH 并配置了免密登录。Windows Powershell 5 。

之前部署到 Linux 上的时候基本就是把 jar 包 scp 上去,然后 ssh 上去用 nohup &运行,这样即使退出 session 程序也会继续运行。

Windows 这边搜了好久,后台运行程序到可以,不过退出 session 后程序也就结束了,找过很多都没有成功的。想请教一下如何实现退出 ssh 会话后仍继续运行的功能?(目前知道 winsw 应该可以,想问问有没有什么更简单的方法)

5475 次点击
所在节点    Windows
31 条回复
daliu
2022-04-12 13:41:54 +08:00
用 nssm 做成任务可能是最简单的办法了
lovestudykid
2022-04-12 14:11:47 +08:00
用 vbs 可以实现
kokutou
2022-04-12 14:12:29 +08:00
做成服务。。
TimePPT
2022-04-12 14:25:01 +08:00
@daliu nssm +1
huang119412
2022-04-12 14:25:05 +08:00
javaw ,这个命令在 win 下应该可以
Juszoe
2022-04-12 14:57:17 +08:00
上面的是 windows 下比较常用的做法,如果你非要类似 nohup&这种操作,可以试试 Powershell 的 Start-Process 命令开启一个独立的进程
Start-Process -WindowStyle Hidden
ysc3839
2022-04-12 18:19:25 +08:00
没有完全对应的操作。不过如果你想避免 SSH 断开后进程被结束的话,得看 SSH Server 是怎么实现的。
Windows 下一般有两种方法实现结束所有子进程:
一种是简单且通用的,直接遍历进程列表,列出子进程的树,再一一结束。这种情况只需要启动两次新进程,即可从树中脱离出去。
另一种是把子进程加入 Job Object ,然后可以结束其中的所有进程。这种情况要看创建 Job Object 的时候是否允许脱离,允许的话在创建进程时加一个 flag 可以脱离。不允许的话理论上是没办法脱离,但实际可以利用 WMI 服务提供的启动新进程的功能来脱离,因为新进程是由 WMI 服务进行启动的,自然不受限制。
Tumblr
2022-04-12 18:46:21 +08:00
在 Windows 下,非登录用户可运行的方式有两种,一是用服务运行,二是计划任务。

其实在 Windows 下的话,如果你只是 disconnect session ,还是可以正常运行的,只是在 log out 的时候你的进程才会关掉。但是很多公司会有策略,一个账号 idle 一段时间之后会强制 log out 。
ikas
2022-04-12 19:28:30 +08:00
最好的方式还是写成服务

一般开源多用 apache commons-daemo,比如 tomcat,elasticsearch 等
https://commons.apache.org/proper/commons-daemon/binaries.html
复制他们的配置修改下就行了

并且它还提供交互接口,管理 ui
mxT52CRuqR6o5
2022-04-12 19:40:52 +08:00
start
SenLief
2022-04-12 19:43:18 +08:00
nssm 可以做成一个服务
oneisall8955
2022-04-12 21:19:03 +08:00
oneisall8955
2022-04-12 21:20:00 +08:00
@oneisall8955 不好意思没看完帖子,忽略~
adoal
2022-04-12 21:34:48 +08:00
其实你在 Linux 下的做法也不地道。Linux 下,在生产环境跑的守护进程,当代的主流做法是写一个 systemd unit 来做启动控制,而不是用交互登录的帐号手工启动。Windows 下也是同理,要做成服务。
aisk
2022-04-12 21:50:22 +08:00
你在 Linux 上的这个用法,就不担心进程因为 OOM 等其他原因挂了,没人自动帮你重启吗?
UnknownR
2022-04-12 22:55:04 +08:00
`nohup &` 是创建用户账号下的后台进程,在 windows 下的话可以通过 powershell 调用像 start-process 或者 c#的进程类来实现,实际是一样的。

最佳的使用方式是像前几楼所说的,linux 下创建 systemd 的守护进程,以系统用户运行。windows 下可以是创建计划任务或者 service 以系统用户运行,比如自带的 sc /create 或者 nssm 这种第三方工具,也可以在 powershell 里用[System.Process.StartInfo]::new() 和 [System.Process]::Start(ProcessStartInfo) 来创建系统级进程。
lolizeppelin
2022-04-12 23:17:45 +08:00
fork 后的进程会继承父进程的信号处理
shell 里启动的进程就继承了当前终端进程对应的信号处理,也就是 shell 接受到退出信号时,子进程也会按照父进程原有方式处理。

nohup 实际的作用是,fork 后清空信号处理,避免子进程收到退出信号

Linux 下标准做法是 fork 两次 setsid,重新注册自己的信号处理,
nohup 就是在 shell 终端里实现 fork 一次,重设信号的流程而已

附注:linux 的没有 nohup 函数. setsid 命令可以简单理解为调用 setsid 函数,有兴趣你可以看看 shell 命令里 setsid 与 nohup 的区别
lolizeppelin
2022-04-12 23:21:56 +08:00
windows 的机制比 linux 复杂,没有像 linux 这样 fork 后退出进程,子进程挂到 pid 1 下这种方便的常驻进程方式
所有只能使用 windows 标准机制。
Jiajin
2022-04-12 23:40:03 +08:00
Start-Job ,但是你这个需求应该是 javaw
ysc3839
2022-04-13 00:26:38 +08:00
@lolizeppelin Windows 反而没有 Unix 那么复杂,本来子进程就不会受父进程影响的,父进程启动子进程后,只要父进程不主动进行一些操作,子进程是不会退出的。
前面有人提到 logout session 会结束 session 中所有进程,这是一个特殊情况。如果进程是由 SSH 服务启动起来的,会随 SSH 服务在 session 0 ,这个 session 是一直存在的。
所以只要 SSH 服务不主动进行一些动作,子进程是能一直存在的。因此我说得看 SSH 服务具体用了什么方法来结束子进程,选择合适的方法“绕过”即可。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/846505

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX