如何在启动时运行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,但这对我来说并不管用。

1330641 次浏览

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

/PATH/TO/MY_APP &

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

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

(后面的&号作为进程的背景,并允许rc。本地继续执行)

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

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

稍微调整一下。

你放入/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 < / p >

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

/var/myscripts/start_my_app

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

#!/bin/sh

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

不是每个版本的cron都支持这一点,但如果您的实例基于Amazon Linux AMI,那么它就可以工作。

这是我在红帽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

对某些人来说,这是可行的:

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

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

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

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

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

chmod +x /home/user/startup.sh

然后为它设置crontab:

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

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

你可以这样做:

chmod +x PATH_TO_YOUR_SCRIPT/start_my_app

然后使用下面的命令

update-rc.d start_my_app defaults 100

请参阅本页Cyberciti

  • 将脚本添加到/etc/init.d /目录
  • 更新rc run-levels: $ update-rc.d myScript.sh defaults NN,其中NN是它应该执行的顺序。例如,99意味着它将在98之后和100之前运行

只需有一行添加到您的crontab..

确保文件是可执行的:

chmod +x /path_to_you_file/your_file

编辑crontab文件。

crontab -e

你必须添加的行:

@reboot  /path_to_you_file/your_file

这么简单!

简单的解决方案在运行CentOS的亚马逊Linux实例上为我工作。 编辑你的/etc/rc.d/rc.local文件并把命令放在那里。在这个文件中提到,它将被执行所有其他初始化脚本。所以在这方面要小心。这是我当前文件的样子。__abc2。最后一行是我的脚本名称

Debian 9参见https://askubuntu.com/questions/228304/how-do-i-run-a-script-at-start-up。它帮助了我。Debian 9的简短版本: 添加命令(作为根)到/etc/rc.local

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

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

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

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

只需要选择一个任意的可执行文件甚至一个shell脚本,并用命令行参数引导内核:

init=/path/to/myinit

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

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

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

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

使用sudo输入cron:

sudo crontab -e

添加一个在启动时运行的命令,在这种情况下是一个脚本:

@reboot sh /home/user/test.sh

拯救策略:

按ESC然后:x保存并退出,或者按ESC然后ZZ(也就是shift+ ZZ)

测试测试:

  1. 运行不带cron的测试脚本,以确保它实际工作。

  2. 确保你的命令保存在cron中,使用sudo crontab -e

  3. 重新启动服务器以确认一切正常sudo @reboot

在卢本图,我不得不处理相反的情况。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

删除这个文件对我有帮助。

无痛,最简单,最通用的方法是简单 使用~.bash_profile~.profile (如果你没有bash_profile文件)执行

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

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

使用Python 3微服务或shell;使用Ubuntu  Server  18.04(仿生海狸)或19.10 Ubuntu  (Eoan银鼠)或18.10 Ubuntu (宇宙墨鱼)我总是确实喜欢这些步骤,并且它也工作总是:

  1. 创建一个名为"brain_microservice1. "的微服务。在我的案例中:

    $ nano /lib/systemd/system/brain_microservice1.service
    
  2. Inside this new service that you are in:

    [Unit]
    Description=brain_microservice_1
    After=multi-user.target
    
    
    [Service]
    Type=simple
    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
    
  3. Give the permissions:

    $ chmod -X /lib/systemd/system/brain_microservice*
    $ chmod -R 775 /lib/systemd/system/brain_microservice*
    
  4. Give the execution permission then:

    $ systemctl daemon-reload
    
  5. Enable then, this will make then always start on startup

    $ systemctl enable brain_microservice1.service
    
  6. Then you can test it;

    $ sudo reboot now

  7. Finish = SUCCESS!!

This can be done with the same body script to run shell, react ... database startup script ... any kind os code ... hope this help u...

...

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

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

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

首先:编写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";

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

第二步:打开应用程序“启动应用程序首选项”

enter image description here

enter image description here

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

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

第七步:点击添加。完成了!

现在重新启动你的电脑来确认。

干杯!

编辑rc。使用nanogedit编辑器在本地文件中添加脚本。文件路径可以是/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,然后按__abc1,然后按ctrl+x

使文件可执行。

sudo chmod 755 /etc/rc.local

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

sudo systemctl start rc-local

很多答案都是在启动时启动某个东西,但通常你想稍微晚一点启动它,因为你的脚本依赖于例如网络。使用at来添加这个延迟,例如:

at now + 1 min -f /path/yourscript

你可以在/etc/rc.中添加但也在cron中,如:

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

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

至于@reboot可能不被广泛支持的评论,试试看吧。我发现/etc/rc.Local在支持systemd的发行版上已经过时了,比如ubuntu和raspbian。

有多种完成方法:

  1. 定时任务
  2. 自动加载
  3. 摆在
  4. systemd