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

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

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

此外,该问题专门针对 SSH 服务器,因此需要考虑和处理安全问题,导致步骤过于复杂。无论如何,该问题中探讨的步骤都已尝试过,但均无效。此外,该问题专门针对 SSH 服务器,而该问题涉及一般环境要求,即我需要知道如何在 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

我也做过这样的事情:

在启动时运行 bash/cron 循环

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

Paste: C:\Windows\System32\bash.exe -c 'while [ true ]; do sudo /usr/sbin/cron -f; done'

这是行不通的。

如何在 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/

正如您所猜测的,它仍然不起作用。坦率地说,我希望可以在 WSL 中执行此操作,因为这是我首选的方式,但我愿意采取任何方式。

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

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

我已经检查了其他问题,有一个名为 Mysys 的软件包似乎提供了一个解决方案,但是这与微软提供的集成不同,后者是一个很好的进步。

答案1

我使用 mysql 服务的示例

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

     %sudo   ALL=(ALL) NOPASSWD: /usr/sbin/service mysql start
    
  2. .bat使用此行在 Windows 启动目录中创建文件(dir find here: Win+Rshell:startup):

     wsl sudo service mysql start
    

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

答案2

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

随着 Windows 11 的发布,WSL 中增加了一项新功能来解决此问题。如果您安装来自 Microsoft Store 的 WSL(需要KB5020030,应该可以在可选更新)。

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

[boot]
command = <command to run as root>; <other command to run as root>

如果你使用此方法运行服务(例如cronsshd),请注意,当启动的最后一个进程互动地keychain完成。你可以在我对 Ask Ubuntu 问题的回答中看到更多讨论(以及使用 的解决方法)是否可以在后台运行 WSL 应用程序?

例如:

[boot]
command="service ssh start; service cron start"

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

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

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

答案3

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

有很多页面和答案表明如何创建脚本以在计算机启动时启动 WSL Linux

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

笔记:如果您的程序必须使用 来执行sudo,则必须将其配置为无需密码即可启动程序。

  • 在linux中运行visudo,在文件最后面添加一行:%sudo ALL=NOPASSWD: /full/path/to/program

答案4

感谢您的提问,它引导我找到了这个解决方案。这是我的完整、通用和具体的解决方案。它包括 3 个步骤:

  1. 创建一个 cronjob
  2. 在启动时运行/启用 cronjob 服务
  3. 删除提示输入密码以自动启动 cronjob 服务。

实际上,您的问题仅通过第 2 步和第 3 步就已经解决了,但由于您尝试使用 cronjob 来完成,因此为了完整性我还添加了该步骤。

1.创建一个正常运行的 cronjob:

  1. 浏览至文件夹/etc/
  2. 然后在文件夹中/etc/输入:sudo nano crontab
  3. 在名为 crontab 的文件中输入您的命令。
  4. 例如:*/1 * * * * root touch /var/www/myFile
  5. 每分钟创建一个myFile在位置命名的文件。/var/www/
  6. 为了完整性:*/1 * * * * root touch /var/www/myFile意味着:每小时的第一分钟创建该文件。

该文件的示例crontab如下所示(我只添加了最后一行,其余部分已经存在于我的设置中):

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
*/2 * * * * root touch /var/www/myFile

2. 启用 cronjob 服务

要在 WSL Ubuntu 16.04 启动时自动运行命令,您可以:

  1. cd 到/home/<your ubuntu user name>
  2. sudo nano .bashrc
  3. 然后文本编辑器 nano 创建/打开一个文件.bashrc
  4. 在该文件中,已经可以显示很多示例,只需在启动 WSL ubuntu 16.04 时执行您的命令,请将您的命令写在文件的第一行.bashrc
  5. 例如:echo "hello world"如下图所示。
  6. 对于您的特定问题,特定的解决方案是输入以下行:sudo ./xmr-stak-cpu
  7. 使用以下命令关闭编辑器:ctrl+x
  8. 使用以下方式保存文件Y
  9. 退出 ubuntu
  10. 重新启动 ubuntu 并验证确实在您的用户名前打印了 hello world。

![.bashrc 中在 WSL ubuntu 启动时执行的示例命令。]1

例如,这可能是.bashrc您编辑后的样子:(我只在顶部添加了第一行,其余部分已经在我的设置中了。)

sudo -i service cron start
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar

# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color|*-256color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
        # We have color support; assume it's compliant with Ecma-48
        # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
        # a case would tend to support setf rather than setaf.)
        color_prompt=yes
    else
        color_prompt=
    fi
fi

你可以用 替换该hello world命令sudo service cron start来启用 cronjob 服务。不过你仍然需要手动输入密码。

3. 删除密码提示: 使用:https://askubuntu.com/questions/147241/execute-sudo-without-password

  1. 打开 WSL ubuntu 16.04(终端)
  2. sudo visudo
  3. 在文件底部添加行: <your WSL ubuntu username> ALL=(ALL) NOPASSWD: ALL
  4. 例如,对于用户名 zq,您需要将以下行添加到文件底部:
  5. zq ALL=(ALL) NOPASSWD: ALL
  6. ctrl+x 退出
  7. y然后<enter>保存。
  8. 然后再次关闭 ubuntu 并重新打开并验证
  9. 当您启动/打开 WSL ubuntu 16.04 时,cron 服务会自动运行,无需提示输入密码。
  10. (您可以使用命令检查:sudo service cron status。)

例如,防止在启动时提示输入密码的代码如下所示(我只添加了最后一行,其余部分已经在我的设置中):

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/s$
# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d
%sudo ALL=NOPASSWD: /etc/init.d/cron
zq ALL=(ALL) NOPASSWD: ALL

在研究这个解决方案的过程中,我了解到 cronjobs 旨在定期运行某些东西,而不是在启动等特定事件时运行。要在 WSL 中在启动时运行某些东西,您可以使用文件 /home/<username>/.bashrc

相关内容