nohup
命令本身并不提供自动重启功能。它的主要作用是在用户退出登录后,继续运行指定的命令或程序。如果你希望在使用 nohup
的同时实现自动重启,可以考虑以下几种方法:
supervisord
supervisord
是一个进程管理工具,可以监控和管理多个进程,并在进程退出时自动重启。
安装 supervisord
:
sudo apt-get install supervisor # Debian/Ubuntu
sudo yum install supervisor # CentOS/RHEL
配置 supervisord
:
创建一个新的配置文件,例如 /etc/supervisor/conf.d/myapp.conf
:
[program:myapp]
command=/path/to/your/command
autostart=true
autorestart=true
stderr_logfile=/var/log/myapp.err.log
stdout_logfile=/var/log/myapp.out.log
启动 supervisord
:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start myapp
systemd
如果你使用的是 systemd,可以创建一个服务单元文件来实现自动重启。
创建服务单元文件:
创建一个新的服务单元文件,例如 /etc/systemd/system/myapp.service
:
[Unit]
Description=My Application
After=network.target
[Service]
ExecStart=/path/to/your/command
Restart=always
RestartSec=5
User=your_username
Group=your_groupname
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=myapp
[Install]
WantedBy=multi-user.target
重新加载 systemd 配置:
sudo systemctl daemon-reload
启动服务:
sudo systemctl start myapp
设置开机自启动:
sudo systemctl enable myapp
cron
和 nohup
你可以使用 cron
定期检查进程是否运行,并在进程退出时使用 nohup
重新启动它。
编辑 crontab 文件:
crontab -e
添加以下内容:
* * * * * pgrep -f /path/to/your/command || nohup /path/to/your/command &
这个例子中,pgrep -f /path/to/your/command
用于检查进程是否运行,如果没有找到,则使用 nohup
启动它。
while
循环你可以在脚本中使用 while
循环来不断检查进程是否运行,并在进程退出时重新启动它。
#!/bin/bash
while true; do
nohup /path/to/your/command &
wait $!
echo "Process exited with code $?; restarting..."
sleep 5
done
将这个脚本保存为 run_myapp.sh
,然后使用 nohup
或 systemd
启动它。
选择适合你需求的方法来实现自动重启功能。