ChatGPT解决这个技术问题 Extra ChatGPT

如何在启动时运行 shell 脚本

在一个 Amazon S3 Linux 实例上,我有两个名为 start_my_appstop_my_app 的脚本,它们启动和停止 forever(依次运行我的 Node.js 应用程序)。我使用这些脚本手动启动和停止我的 Node.js 应用程序。到目前为止,一切都很好。

我的问题:我还想设置它,以便在系统启动时运行 start_my_app。我知道我需要在 init.d 中添加一个文件,并且我知道如何将它符号链接到 rc.d 中的正确目录,但我无法弄清楚我放置在 init.d 中的文件中实际需要进入的内容}。我认为它应该只是一行,例如 start_my_app,但这对我不起作用。

我不是这类东西的专家,但我认为 init.d 解决方案 (here) 应该优于 rc.local 解决方案,因为后者是旧工具,只有新工具才能使用向后兼容。
pm2 启动 my_app; pm2 启动; pm2 保存 github.com/Unitech/pm2
在 Raspbian 中有一个 .config/lxsession/LXDE-pi/autostart 对我来说效果更好 - 在其他操作系统中是否有等效项?它对我来说效果更好的原因是,当 rc.local 执行时,并不是所有的东西(在我的例子中是 apache)都被初始化,而 autostart 是用户会话的开始,所以到那时几乎所有的东西都应该被初始化。

B
Black

首先创建你的启动脚本@/home/user/startup.sh,并使其可执行

chmod +x /home/user/startup.sh

然后为它设置一个crontab:

$ crontab -e
@reboot  /home/user/startup.sh

现在您的 startup.sh 脚本将在每次启动时运行。


这是唯一对我有用的解决方案!谢谢你
这是最好的解决方案,crontab 中的 @reboot sh $HOME/test.sh 更干净
@user3667089 实际上,它不起作用。我打开终端,输入“crontab -e”,出现一个窗口,我在其中写入“@reboot sh /home/user/test.sh”,但它不会在启动时运行。我在哪里做错了?
@MycrofD 您的 crontab -l 应该显示 @reboot sh $HOME/test.sh 以确认它确实已设置。
在 ubuntu 中,您必须:@reboot root sh script.sh
J
Jonathan Muller

您放入 /etc/init.d/ 的文件必须设置为可执行文件:

chmod +x /etc/init.d/start_my_app

正如@meetamit 所指出的,如果它仍然没有运行,您可能必须在 /etc/rc.d/ 中创建指向该文件的符号链接

ln -s /etc/init.d/start_my_app /etc/rc.d/

请注意,在最新版本的 Debian 上,这将不起作用,因为您的脚本必须符合 LSB(至少提供以下操作:启动、停止、重新启动、强制重新加载和状态):https://wiki.debian.org/LSBInitScripts

请注意,您应该始终在脚本中使用文件的绝对路径而不是相对路径,这可能会解决意想不到的问题:

/var/myscripts/start_my_app

最后,确保在文件顶部包含 shebang:

#!/bin/sh

我这样做了,但它没有运行。它会因为它在 /etc/init.d 中而自动运行,还是我需要在上面做一些事情来安排它在系统启动时运行?
@amphibient 还不够...您还需要创建指向此文件的符号链接(使用 ln 命令)到 rc.d 中的目录
我的根目录 etc 文件夹中没有 rc.d 目录。这让我目瞪口呆,这不是 Linux 需要启动的关键目录吗?它只是缺少我的操作系统似乎运行良好。我必须创建它吗?我看到一堆类似名称的文件,如“rc1.d”一直到“rc5.d”
我没有任何 /etc/rc.d 文件夹,但我有 /etc/rcX.d 个文件夹(即 /etc/rc0.d/etc/rc1.d /etc/rcS.d),还有一个文件/etc/rc.local。我认为您应该在自定义文件夹中创建符号链接,例如 /etc/rc9.d 或现有...(Ubuntu Server 14.04)之一
这个问题帮助了我:unix.stackexchange.com/questions/28679/…
G
Gilles Quenot

一种简单的方法是在 /etc/rc.local 中添加一行:

/PATH/TO/MY_APP &

或者,如果您想以特殊用户身份运行命令:

su - USER_FOOBAR -c /PATH/TO/MY_APP &

(尾随的&符号使进程后台运行并允许 rc.local 继续执行)

如果你想要一个完整的初始化脚本,debian 发行版有一个模板文件,所以:

cp /etc/init.d/skeleton /etc/init.d/your_app

并稍作调整。


谢谢!考虑到简单的要求,这种方法效果最好。我很确定我确实需要指定用户,否则当需要手动停止应用程序(通过运行 stop_my_app)时,我必须使用 sudo,不是吗?另外,我想知道尾随与号(?)的功能到底是什么。
用户取决于您的应用程序。但如果不是绝对需要以 root 身份运行,请避免使用它。 & 在后台运行进程
sputnick,抱歉,但我必须将 Koren 的答案标记为已接受的答案,主要是因为 @erikb85 指出的内容,还因为我最初的问题要求 init.d 做事方式(您的答案对我来说只是一个更简单的解决方法时间)。这篇文章获得了很多观点和投票,因此保持准确很重要。
似乎没有提到尾随的&符号使进程成为背景并允许 rc.local 继续执行。
谢谢你!在我尝试提供服务时,花了最后几个小时将我的头撞到墙上,但没有任何效果。试过这个,就像一个魅力!
P
Peter Mortensen

这是我在 Red Hat Linux 系统上执行此操作的方式。

将您的脚本放在 /etc/init.d 中,由 root 拥有并可执行。在脚本的顶部,您可以为 chkconfig 提供指令。例如,以下脚本用于以用户 oracle 身份启动 Java 应用程序。

脚本的名称是 /etc/init.d/apex

#!/bin/bash
# chkconfig: 345 99 10
# Description: auto start apex listener
#
case "$1" in
 'start')
   su - oracle -c "cd /opt/apex ; java -jar apex.war > logs/apex.log 2>logs/apex_error.log &";;
 'stop')
   echo "put something to shutdown or kill the process here";;
esac

这表示脚本必须在级别 3、4 和 5 运行,并且启动/停止的优先级是 99 和 10。

然后,作为用户 root,您可以使用 chkconfig 在启动时启用或禁用脚本:

chkconfig --list apex
chkconfig --add apex

您可以使用 service start/stop apex


与此同时,我尝试了一个名为 supervisord (supervisord.org) 的包,它可以在 epel 存储库中找到。它可用于启动程序并监视它们,在失败时重新启动它们。
将脚本放入 /etc/init.d/ 文件夹后,无需键入:“chkconfig --add service_name”,您可以键入:“chkconfig service_name on”
O
Omar Ali

使用 sudo 输入 cron

sudo crontab -e

添加一个在启动时运行的命令,在本例中是一个脚本:

@reboot sh /home/user/test.sh

节省:

按 ESC 然后 :x 保存并退出,或按 ESC 然后 ZZ(即 shift+zz)

测试测试测试:

在没有 cron 的情况下运行您的测试脚本,以确保它确实有效。确保您将命令保存在 cron 中,使用 sudo crontab -e 重新启动服务器以确认一切正常 sudo @reboot


我非常喜欢这个。谢谢!附言。如果您想在启动期间使用当前用户运行某个命令,请不要使用 sudo
这些信息应该存储在哪里?不在 /tmp 中??
根据 Wikipedia,@reboot 未得到广泛支持。
它适用于 ubuntu 18 !!!!!!!!!
P
Patrick Q

只需在您的 crontab 中添加一行 ..

确保文件是可执行的:

chmod +x /path_to_you_file/your_file

编辑 crontab 文件:

crontab -e

您必须添加的行:

@reboot  /path_to_you_file/your_file

就这么简单!


这对我不起作用,我缺少什么吗? # uname -a Linux accton-xp70a0-26-a1 3.11.10-301.fc20.x86_64 #1 SMP Thu Dec 5 14:01:17 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
这在 CentOs 7 上对我有用。对于那些有问题的人,我确实需要创建一个 shell 脚本,使其可执行(chmod +x file_name),并从 cron 调用 shell 脚本,而后者又调用 node path_to_file/index.js
c
chris

另一种选择是在您的 crontab 中使用 @reboot 命令。

并非每个版本的 cron 都支持这一点,但如果您的实例基于 Amazon Linux AMI,那么它将起作用。


D
Dohd

使用 nanogedit 编辑器编辑 rc.local 文件并在其中添加您的脚本。文件路径可以是 /etc/rc.local/etc/rc.d/rc.local

sudo nano /etc/rc.local

这是编辑:

#!/bin/sh
/path-to-your-script/your-scipt-name.sh

完成后按 ctrl+o 更新,按 Enter 然后按 ctrl+x

使文件可执行。

sudo chmod 755 /etc/rc.local

然后启动 rc-local 服务以在启动期间运行脚本。

sudo systemctl start rc-local

s
sobolevn

你能行的 :

chmod +x PATH_TO_YOUR_SCRIPT/start_my_app 

然后使用这个命令

update-rc.d start_my_app defaults 100

请在 Cyberciti 上查看此页面。


我有一个非常简单的设置,建立在 yocto 上,这是让我的脚本工作的唯一方法。谢谢。
f
fieldsweeper

如果您只想运行一个简单的脚本(或任何东西),那么绝对最简单的方法是如果您有一个 gui 来使用系统 > 首选项然后启动应用程序。

只需浏览到您想要的脚本,然后就可以了。 (使脚本可执行)


这实际上并不是在启动时运行,而是在登录时运行,这是一个很大的区别。它还取决于特定设置,因为您不会在每个系统(尤其是服务器)上都有“系统 > 首选项”。
搜索词“linux 在启动时执行”让我找到了这个答案,我正在寻找这个答案。尽管它没有回答 OP 的问题,但这可能会帮助像我这样的 linux (ubuntu) 菜鸟,所以它值得一票。我也不喜欢它,但那是实用主义。
s
shshnk

https://i.stack.imgur.com/EVO6n.png


C
Ciro Santilli Путлер Капут 六四事

创建您自己的 /init 可执行文件

这不是你想要的,但它很有趣!

只需选择一个任意可执行文件 even a shell script,然后使用命令行参数启动内核:

init=/path/to/myinit

在引导结束时,Linux 内核在给定路径上运行第一个用户空间可执行文件。

一些项目提供了主要发行版(例如 systemd)使用的流行 init 可执行文件,并且在大多数发行版中,init 会派生出一堆用于正常系统操作的进程。

但是我们可以劫持 /init 它来运行我们自己的最小脚本,以更好地了解我们的系统。

这是一个最小的可重现设置:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/f96d4d55c9caa7c0862991025e1291c48c33e3d9/README.md#custom-init


R
Roland

关于在启动时启动某些东西的许多答案,但通常您希望稍后再启动它,因为您的脚本依赖于例如网络。使用 at 仅添加此延迟,例如:

at now + 1 min -f /path/yourscript

您可以在 /etc/rc.local 中添加它,也可以在 cron 中添加,例如:

# crontab -e
@reboot at now + 1 min -f /path/yourscript

将 cron 和 at 结合起来不是很有趣吗?信息在手册页 man at 中。

至于@reboot 可能没有得到广泛支持的评论,试试看吧。我发现 /etc/rc.local 在支持 systemd 的发行版上已经过时,例如 ubuntu 和 raspbian。


@cregox 我在 Raspberry Pi 模型 3 B+ 和 Pi Zero W 上进行了测试,两者都使用 Raspbian,linux 5.4.51
r
ridox

multi ways to finish it

crontab rc.local init.d systemd


请注意,链接的内容不被视为此处答案的一部分。因此,您的帖子被视为“多种方式;无法解释的关键字”。这不太可能被视为一个有用的答案。请拿起tour并阅读How to Answer
王子1986

我参考了这个博客,听起来总是不错的选择

https://blog.xyzio.com/2016/06/14/setting-up-a-golang-website-to-autorun-on-ubuntu-using-systemd/

vim /lib/systemd/system/gosite.service

Description=A simple go website
ConditionPathExists=/home/user/bin/gosite

[Service]
Restart=always
RestartSec=3
ExecStart=/home/user/bin/gosite

[Install]
WantedBy=multi-user.target

systemctl enable gosite.service

C
Community

对于 Debian 9,请参阅 https://askubuntu.com/questions/228304/how-do-i-run-a-script-at-start-up。它帮助了我。 Debian 9 的短版:将命令(以 root 身份)添加到 /etc/rc.local

/path_to_file/filename.sh ||  exit 1   # Added by me
exit 0

可能 /path_to_file/filename.sh 应该是可执行的(我认为是这样)。


a
aerijman

在 Lubuntu,我不得不处理相反的情况。 Skype 启动后开始运行,我在 ~/.config/autostart/ 文件 skypeforlinux.desktop 中找到。文件内容如下:

[Desktop Entry]
Name=Skype for Linux
Comment=Skype Internet Telephony
Exec=/usr/bin/skypeforlinux
Icon=skypeforlinux
Terminal=false
Type=Application
StartupNotify=false
X-GNOME-Autostart-enabled=true

删除此文件对我有帮助。


a
akbar ali

这里有一个更简单的方法!

首先:编写一个shell脚本并将其保存为.sh 这里是一个例子

#!/bin/bash
Icoff='/home/akbar/keyboardONOFF/icon/Dt6hQ.png'
id=13
fconfig=".keyboard"
echo "disabled" > $fconfig
xinput float $id
notify-send -i $Icoff "Internal Keyboard disabled";

此脚本将在启动时禁用内部键盘。

二:打开应用程序“Startup Application Preferences”

enter image description here

enter image description here

第三:点击添加。第四:在NAME部分给一个名字。第五:在命令部分浏览到您的 .sh 。第六:编辑你的命令部分:

bash <space> path/to/file/<filename>.sh <space> --start

第七:点击添加。而已!完成的!

现在通过重新启动您的电脑进行确认。

干杯!


这仅适用于某些桌面环境
K
Kibrom Gebre

将脚本添加到 /etc/init.d/ 目录

更新你的 rc 运行级别: $ update-rc.d myScript.sh 默认 NN 其中 NN 是它应该执行的顺序。例如 99 意味着它将在 98 之后和 100 之前运行。


J
Juko

无痛、最简单和最通用的方法就是使用 ~.bash_profile~.profile (如果您没有 bash_profile 文件) 执行它。

只需在该文件的底部添加执行命令,它将在系统启动时执行。

我在底部有一个例子; ~\Desktop\sound_fixer.sh


这是不准确的。 ~/.bash_profile 在用户登录时执行 -- not 在系统启动时执行。在最初的问题中,目的是在机器启动时运行 Node.js 应用服务器。您的解决方案将要求人类用户在 Node.js 服务器运行之前首先登录机器。而且,如果某种问题导致服务器在一夜之间重新启动,那么在人类重新登录之前,该应用程序将永远不会恢复活力。
P
Peter Mortensen

使用 Python 3 微服务或 shell;使用 Ubuntu Server 18.04 (Bionic Beaver) 或 Ubuntu 19.10 (Eoan Ermine) 或 Ubuntu 18.10 (Cosmic Cuttlefish) 我总是喜欢这些步骤,而且它也总是

在我的例子中创建一个名为 p 示例“brain_microservice1.service”的微服务: $ nano /lib/systemd/system/brain_microservice1.service 在你所在的这个新服务中:[Unit] Description=brain_microservice_1 After=multi-user.target [服务]类型=简单 ExecStart=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices /microservice_1.py -k start -DFOREGROUND ExecStop=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices /microservice_1.py -k graceful-stop ExecReload=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful PrivateTmp=true LimitNOFILE=infinity KillMode=mixed Restart=on-failure RestartSec= 5s [Install] WantedBy=multi-user.target 授予权限: $ chmod -X /lib/systemd/system/brain_microservice* $ chmod -R 775 /lib/systemd/system/brain_microservice* 然后授予执行权限: $ systemctl daemon-reload 然后启用,这将使 then 总是在启动时启动 $ systemctl enable brain_microse rvice1.service 然后就可以测试了; $ sudo 现在重新启动 Finish = SUCCESS!!

这可以使用相同的主体脚本来运行 shell、react ... 数据库启动脚本 ... 任何类型的操作系统代码 ... 希望这对您有所帮助...

...


P
Peter Mortensen

对于某些人来说,这将起作用:

您可以简单地将以下命令添加到系统 → 首选项 → 启动应用程序中:

bash /full/path/to/your/script.sh

我在系统首选项菜单中没有看到这个。但是当我在应用程序启动器中搜索时,我确实看到了它。
这实际上并不是在启动时运行,而是在登录时运行,这是一个很大的区别。它还取决于特定设置,因为您不会在每个系统(尤其是服务器)上都有“系统 > 首选项”。
这个答案似乎更适用于 Ubuntu/Linux 桌面,但用户实际上是在请求 AWS EC2 Linux 实例的帮助,据我所知,它没有 GUI。