如何让 WSL 在启动时运行服务

sea*_*nbw 45 linux cron ubuntu windows-subsystem-for-linux

搜了这个网站和各种Q后,很明显systemdWSL的服务和不可用。每次启动 PC 时,我都需要在 WSL 中运行一个程序,因此我阅读了有关如何使用 crontab 的页面:如何在 Windows 上运行 Ubuntu 服务(启动时)?超级用户,但我感到困惑,因为格式与 crontab 中的格式不符。

此外,该特定问题是特定于 SSH 服务器的,如果考虑并处理导致步骤过于复杂,则需要安全方面。无论如何,该问题中探索的步骤已经尝试过,但没有奏效。此外,该问题高度针对 SSH 服务器,而该问题涉及一般环境要求 i。我需要知道如何在 WSL 中运行服务(可能包括但不限于 SSH 服务器)

实际上 - 需要比如何在 Windows 上运行 Ubuntu 服务(启动时)更简单的解决方案提供。

但是,这是我的 cron:

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
PATH=cd /usr/local/src/:cd xmr-stak-cpu:cd bin/
@reboot . sudo ./xmr-stak-cpu
Run Code Online (Sandbox Code Playgroud)

我也这样做了:

启动时运行 bash/cron 循环

在 shell:startup 中创建一个名为 linux.bat 的文件

Paste: C:\Windows\System32\bash.exe -c 'while [ true ]; do sudo /usr/sbin/cron -f; done'
Run Code Online (Sandbox Code Playgroud)

这是行不通的。

如何在 WSL 中运行服务?或者有没有办法使用Windows?

因为在 Windows 中我尝试了以下操作:使用https://github.com/Microsoft/WSL/issues/612

Run: When the computer starts, 
Action: Start a program, 
Program: c:\Windows\system32\bash.exe, 
Arguments: -c "sudo  /xmr-stak-cpu/bin/xmr-stak-cpu -D"
Start in:  /usr/local/src/
Run Code Online (Sandbox Code Playgroud)

正如您所猜测的,它仍然不起作用。坦率地说,我希望我能在 WSL 中做到这一点,因为这是我的首选方式,但我会采取任何方式。

我有一个带有 96GB RAM 的工作站,因此我更愿意将它用作双 Linux/Windows 机器而不是我的小笔记本电脑。

我在 Linux 和 Windows 上都有任务,真的需要/更喜欢 Windows 提供的 Linux 解决方案。

我已经查看了另一个问题,有一个名为 Mysys 的软件包似乎提供了一个解决方案,但这与 Microsoft 提供的集成背道而驰,这是一个很好的前进方向。

Not*_*1ds 45

更新:WSL 现在包含启用 Systemd 的功能,显然可以在 WSL 发行版启动时使用 Systemd(正如最初提出的问题)来运行服务。但是,如果这是您需要 Systemd 的唯一原因,那么下面的答案可能是更好的选择,因为它避免了 Systemd 的额外开销和复杂性

随着 Windows 11 的发布,WSL 中添加了一项新功能来解决这个问题。如果您从 Microsoft Store安装 WSL,现在 Windows 10 用户也可以使用此功能(需要KB5020030,它应该在可选更新下提供)。

要在 WSL 启动时运行任意命令,请使用以下内容创建或编辑(如sudo) :/etc/wsl.conf

[boot]
command = <command to run as root>; <other command to run as root>
Run Code Online (Sandbox Code Playgroud)

cron如果您使用此方法(例如或)运行服务,请注意,当最后一个交互式sshd启动的进程完成时,WSL 分发仍将自动终止。您可以在我对询问 Ubuntu 问题是否可以在后台运行 WSL 应用程序的回答中看到更多讨论(以及使用 的解决方法)。。keychain

例如:

[boot]
command="service ssh start; service cron start"
Run Code Online (Sandbox Code Playgroud)

这些命令以 root 身份运行,因此无需使用sudo密码。

请注意(至少目前)如果您尝试有多command=行,则只会执行最后一行。如果您需要在启动时运行多个命令,请像上面那样用分号分隔它们。

如果您需要在Windows登录时启动这些服务,只需在登录时创建一个计划任务即可wsl true。这将启动您的 WSL 实例,触发boot上述命令。

  • 这太棒了,谢谢。遗憾的是,它是另一个没有向后移植到 Windows 10 的功能。 (3认同)

Jai*_*ime 28

在 WSL 中,linux 发行版仅在调用第一个 linux 命令后运行。如果你想运行一个 linux 守护进程(一个服务),你必须在 linux 中配置服务器并运行该 linux 发行版中的任何命令。

有许多页面和答案显示了如何创建一个脚本来在您的计算机启动时启动 WSL linux

  • 有一个WSL-自动启动VBS脚本,您可以使用。您可以安装脚本并commands.txt使用自定义 linux 命令进行更改。
  • 有一个分步教程可以在 WSL 上自动启动 ssh 服务器。
  • 还有一些选项可以创建策略以将程序作为初始任务(使用gpedit.msc命令)或在启动时运行的计划任务(使用)来运行taskschd.msc

注意:如果您的程序必须使用 来执行sudo,您必须将其配置为在不询问密码的情况下启动程序。

  • visudo在linux下运行,在文件末尾添加一行:%sudo ALL=NOPASSWD: /full/path/to/program

  • ...所以我这样做的方法是使用 wsl-autostart 脚本,但跳过告诉您在注册表中创建启动项的说明。相反,使用任务计划程序创建一个任务,该任务在登录时以最大用户权限运行 `start.vbs` 文件。我现在可以在每次启动机器时运行它以在 WSL 中安静地启动 cron 服务 - 就像做梦一样;) (4认同)

小智 23

我的 mysql 服务示例

  1. 创建行/etc/sudoers(在 WSL 以防止询问密码):

     %sudo   ALL=(ALL) NOPASSWD: /usr/sbin/service mysql start
    
    Run Code Online (Sandbox Code Playgroud)
  2. .bat使用此行在 Windows 启动目录中创建文件(目录在此处找到:Win+Rshell:startup):

     wsl sudo service mysql start
    
    Run Code Online (Sandbox Code Playgroud)

重新启动服务后,它会自动启动。

  • 不需要更改 sudoers,也不需要 sudo 来调用服务,只需使用“wsl -u root”即可。 (11认同)
  • @jalescardoso,不,不要那样编辑文件。[始终使用“visudo”编辑“/etc/sudoers”](https://unix.stackexchange.com/q/27594/12606)。(这将使用您的系统默认编辑器,可能是“nano”或“vi”或其他任何编辑器。) (6认同)
  • **重要提示:** 不要将 `.bat` 文件命名为您在其中使用的命令(例如 `wsl.bat`) (4认同)
  • 这是迄今为止最简单的解决方案,并且仍然足够灵活以开始任何事情。 (3认同)
  • 使用 `*` 是矫枉过正,`start` 工作正常。 (2认同)
  • 您也可以在 Windows 任务计划程序中创建一个任务,并在那里设置命令“wsl sudo service mysql start”,而不是创建“.bat”脚本。 (2认同)
  • 在 `sudo nano /etc/sudoers` 中创建行 (2认同)

Ale*_*ing 11

另外一个选择:

1) 在 Linux 中创建启动文件/etc/init-wsl

#!/bin/sh
echo booting
service ssh start
Run Code Online (Sandbox Code Playgroud) 并使脚本可执行

chmod +x /etc/init-wsl

2) 安排在 Windows 启动或登录时执行此文件

测试

由于wsl.exe能够在 wsl 发行版中运行命令,我们只需安排通过命令运行此文件wsl -u root /etc/init-wsl。如果您有多个发行版,您可能需要指定带有标志的-d发行版,例如wsl -d Ubuntu-20.04 -u root /etc/init-wsl