dcsuibian
V2EX  ›  Windows

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

  •  
  •   dcsuibian · Apr 12, 2022 · 7530 views
    This topic created in 1669 days ago, the information mentioned may be changed or developed.

    最近在做的一个项目,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 应该可以,想问问有没有什么更简单的方法)

    Supplement 1  ·  Apr 13, 2022

    感谢各位,最近比较忙没及时回复。看了大家的回复,看来是偷不了这个懒了,准备包装成服务了。

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

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

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

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

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

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

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

    附注:linux 的没有 nohup 函数. setsid 命令可以简单理解为调用 setsid 函数,有兴趣你可以看看 shell 命令里 setsid 与 nohup 的区别
    lolizeppelin
    lolizeppelin
    Apr 12, 2022
    18
    windows 的机制比 linux 复杂,没有像 linux 这样 fork 后退出进程,子进程挂到 pid 1 下这种方便的常驻进程方式
    所有只能使用 windows 标准机制。
    Jiajin
    Jiajin
    Apr 12, 2022
    19
    Start-Job ,但是你这个需求应该是 javaw
    ysc3839
    ysc3839
    Apr 13, 2022❤️1
    20
    @lolizeppelin Windows 反而没有 Unix 那么复杂,本来子进程就不会受父进程影响的,父进程启动子进程后,只要父进程不主动进行一些操作,子进程是不会退出的。
    前面有人提到 logout session 会结束 session 中所有进程,这是一个特殊情况。如果进程是由 SSH 服务启动起来的,会随 SSH 服务在 session 0 ,这个 session 是一直存在的。
    所以只要 SSH 服务不主动进行一些动作,子进程是能一直存在的。因此我说得看 SSH 服务具体用了什么方法来结束子进程,选择合适的方法“绕过”即可。
    msg7086
    msg7086
    Apr 13, 2022
    21
    nohup 跑项目的建议招一个兼职的运维。
    liaohongxing
    liaohongxing
    Apr 13, 2022
    22
    java 项目也是 6 ,敢用 nohup 这种不带进程监控的直接运行 。半夜服务挂了,还得电话起来 起进程
    julyclyde
    julyclyde
    Apr 13, 2022
    23
    nohup 和&其实是两件事
    你都没发现它是两件事,提问的时候你知道自己想要的是什么吗?
    julyclyde
    julyclyde
    Apr 13, 2022
    24
    @liaohongxing 政企类项目大都这样的
    Bingchunmoli
    Bingchunmoli
    Apr 13, 2022 via Android
    25
    @liaohongxing 日常了百度出来就是这个,不过 java 稳定性还好
    Bingchunmoli
    Bingchunmoli
    Apr 13, 2022 via Android
    26
    Windows 双击启动就不管,狗头
    anyele
    anyele
    Apr 14, 2022
    27
    做过 windows 应用的路过, 吃过做成服务的亏, 强烈建议不要做成服务, 原因是你后面更新的时候会很麻烦, 停止服务->更新文件->启动服务的过程中, 可能会遇到服务停止不成功, 或者服务启动不成功, 没必要给自己增加工作量

    上面说既然有 powershell, 那就独立起一个进程就行了, 要是有界面就隐藏掉
    anyele
    anyele
    Apr 14, 2022
    28
    上面说做成服务的可能都没在实际项目中操作过, 除非你这个项目启动了就不更新了, 一旦涉及到更新, 你会花很多代码去检测服务的各种状态, 不然没办法更新文件, 完全得不偿失, 还可能你执行了停止服务的命令, 但服务并不是秒停, 要等一会, 甚至还停止不成功的蛋疼情况
    dcsuibian
    dcsuibian
    OP
    Apr 15, 2022
    29
    @msg7086
    @liaohongxing
    @julyclyde
    如果不是生活所迫,谁愿意全干呢。
    之前在自己的 ubuntu 上运行过一段时间,还是挺稳定的。
    用 WinSW 做过服务,但一直不确定是不是一种好方案。甲方催得急,也不是那种正式使用的状态,就是单纯要求要“有”,所以寻思着先偷个懒。一方面是没有试错的时间,另一方面确实也想了解下 Windows 下对应的方式。
    dcsuibian
    dcsuibian
    OP
    Apr 15, 2022
    30
    @anyele 最终还是做成服务了,幸好我的是小型单体应用。写了个脚本,Stop-Service 后 scp jar 包上去再 Start-Service ,勉强想办法完成了批量更新操作。
    julyclyde
    julyclyde
    Apr 15, 2022
    31
    @dcsuibian 按说这些通用的知识应该早已积累下来了呀
    难道这是第一个项目?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2072 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 72ms · UTC 02:18 · PVG 10:18 · LAX 18:18 · JFK 21:18
    ♥ Do have faith in what you're doing.