在搜索了此网站和各种问答后,很明显systemd
WSL 无法使用服务和。每次启动 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 服务的示例
创建行
/etc/sudoers
(在 WSL 中以防止询问密码):%sudo ALL=(ALL) NOPASSWD: /usr/sbin/service mysql start
.bat
使用此行在 Windows 启动目录中创建文件(dir find here: Win+R和shell: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>
如果你使用此方法运行服务(例如cron
或sshd
),请注意,当启动的最后一个进程互动地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 个步骤:
- 创建一个 cronjob
- 在启动时运行/启用 cronjob 服务
- 删除提示输入密码以自动启动 cronjob 服务。
实际上,您的问题仅通过第 2 步和第 3 步就已经解决了,但由于您尝试使用 cronjob 来完成,因此为了完整性我还添加了该步骤。
1.创建一个正常运行的 cronjob:
- 浏览至文件夹
/etc/
- 然后在文件夹中
/etc/
输入:sudo nano crontab
- 在名为 crontab 的文件中输入您的命令。
- 例如:
*/1 * * * * root touch /var/www/myFile
- 每分钟创建一个
myFile
在位置命名的文件。/var/www/
- 为了完整性:
*/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 启动时自动运行命令,您可以:
- cd 到
/home/<your ubuntu user name>
sudo nano .bashrc
- 然后文本编辑器 nano 创建/打开一个文件
.bashrc
- 在该文件中,已经可以显示很多示例,只需在启动 WSL ubuntu 16.04 时执行您的命令,请将您的命令写在文件的第一行
.bashrc
。 - 例如:
echo "hello world"
如下图所示。 - 对于您的特定问题,特定的解决方案是输入以下行:
sudo ./xmr-stak-cpu
- 使用以下命令关闭编辑器:
ctrl+x
- 使用以下方式保存文件
Y
- 退出 ubuntu
- 重新启动 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
- 打开 WSL ubuntu 16.04(终端)
sudo visudo
- 在文件底部添加行:
<your WSL ubuntu username> ALL=(ALL) NOPASSWD: ALL
- 例如,对于用户名 zq,您需要将以下行添加到文件底部:
zq ALL=(ALL) NOPASSWD: ALL
- ctrl+x 退出
y
然后<enter>
保存。- 然后再次关闭 ubuntu 并重新打开并验证
- 当您启动/打开 WSL ubuntu 16.04 时,cron 服务会自动运行,无需提示输入密码。
- (您可以使用命令检查:
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
。