在一个 Amazon S3 Linux 实例上,我有两个名为 start_my_app
和 stop_my_app
的脚本,它们启动和停止 forever(依次运行我的 Node.js 应用程序)。我使用这些脚本手动启动和停止我的 Node.js 应用程序。到目前为止,一切都很好。
我的问题:我还想设置它,以便在系统启动时运行 start_my_app
。我知道我需要在 init.d
中添加一个文件,并且我知道如何将它符号链接到 rc.d
中的正确目录,但我无法弄清楚我放置在 init.d
中的文件中实际需要进入的内容}。我认为它应该只是一行,例如 start_my_app
,但这对我不起作用。
首先创建你的启动脚本@/home/user/startup.sh,并使其可执行
chmod +x /home/user/startup.sh
然后为它设置一个crontab:
$ crontab -e
@reboot /home/user/startup.sh
现在您的 startup.sh 脚本将在每次启动时运行。
您放入 /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
ln
命令)到 rc.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)之一
一种简单的方法是在 /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
,不是吗?另外,我想知道尾随与号(?)的功能到底是什么。
&
在后台运行进程
init.d
做事方式(您的答案对我来说只是一个更简单的解决方法时间)。这篇文章获得了很多观点和投票,因此保持准确很重要。
这是我在 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
。
使用 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
中??
@reboot
未得到广泛支持。
只需在您的 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
另一种选择是在您的 crontab 中使用 @reboot 命令。
并非每个版本的 cron 都支持这一点,但如果您的实例基于 Amazon Linux AMI,那么它将起作用。
使用 nano
或 gedit
编辑器编辑 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
你能行的 :
chmod +x PATH_TO_YOUR_SCRIPT/start_my_app
然后使用这个命令
update-rc.d start_my_app defaults 100
请在 Cyberciti 上查看此页面。
如果您只想运行一个简单的脚本(或任何东西),那么绝对最简单的方法是如果您有一个 gui 来使用系统 > 首选项然后启动应用程序。
只需浏览到您想要的脚本,然后就可以了。 (使脚本可执行)
https://i.stack.imgur.com/EVO6n.png
创建您自己的 /init 可执行文件
这不是你想要的,但它很有趣!
只需选择一个任意可执行文件 even a shell script,然后使用命令行参数启动内核:
init=/path/to/myinit
在引导结束时,Linux 内核在给定路径上运行第一个用户空间可执行文件。
一些项目提供了主要发行版(例如 systemd)使用的流行 init
可执行文件,并且在大多数发行版中,init 会派生出一堆用于正常系统操作的进程。
但是我们可以劫持 /init
它来运行我们自己的最小脚本,以更好地了解我们的系统。
关于在启动时启动某些东西的许多答案,但通常您希望稍后再启动它,因为您的脚本依赖于例如网络。使用 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。
crontab rc.local init.d systemd
我参考了这个博客,听起来总是不错的选择
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
对于 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 应该是可执行的(我认为是这样)。
在 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
删除此文件对我有帮助。
这里有一个更简单的方法!
首先:编写一个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”
第三:点击添加。第四:在NAME部分给一个名字。第五:在命令部分浏览到您的 .sh 。第六:编辑你的命令部分:
bash <space> path/to/file/<filename>.sh <space> --start
第七:点击添加。而已!完成的!
现在通过重新启动您的电脑进行确认。
干杯!
将脚本添加到 /etc/init.d/ 目录
更新你的 rc 运行级别: $ update-rc.d myScript.sh 默认 NN 其中 NN 是它应该执行的顺序。例如 99 意味着它将在 98 之后和 100 之前运行。
无痛、最简单和最通用的方法就是使用 ~.bash_profile
或 ~.profile
(如果您没有 bash_profile 文件) 执行它。
只需在该文件的底部添加执行命令,它将在系统启动时执行。
我在底部有一个例子; ~\Desktop\sound_fixer.sh
~/.bash_profile
在用户登录时执行 -- not 在系统启动时执行。在最初的问题中,目的是在机器启动时运行 Node.js 应用服务器。您的解决方案将要求人类用户在 Node.js 服务器运行之前首先登录机器。而且,如果某种问题导致服务器在一夜之间重新启动,那么在人类重新登录之前,该应用程序将永远不会恢复活力。
使用 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 ... 数据库启动脚本 ... 任何类型的操作系统代码 ... 希望这对您有所帮助...
...
对于某些人来说,这将起作用:
您可以简单地将以下命令添加到系统 → 首选项 → 启动应用程序中:
bash /full/path/to/your/script.sh
@reboot sh $HOME/test.sh
更干净crontab -l
应该显示@reboot sh $HOME/test.sh
以确认它确实已设置。@reboot root sh script.sh