我正在提供一项服务,这取决于Cassandra优雅地出现并且群集正在准备就绪。
为确保满足依赖性顺序,我有以下单元文件
[Unit]
Requires=cassandra.service
After=cassandra.service
[Service]
Environment=JAVA_HOME=/usr/java/jre
ExecStart=@bringup.instance.path@/webapps/bringup-app/bin/bringup
TimeoutStartSec=0
ExecStop=
PIDFile=@bringup.instance.path@/logs/bringup.pid
Restart=always
[Install]
WantedBy=multi-user.target
如何确保启动应用程序进程在尝试启动之前等待30秒?目前虽然它是在Cassandra之后启动的,但我注意到Cassandra集群尚未启动,因此任何来自启动应用程序连接到Cassandra的尝试都会失败。
因此我想加一个延迟。这可以通过单位文件吗?
答案 0 :(得分:35)
您可以使用sleep在ExecStart之前运行ExecStartPre命令:
[Service]
ExecStartPre=/bin/sleep 30
答案 1 :(得分:13)
您可以创建一个.timer
系统单位文件来控制.service
单位文件的执行。
例如,要在启动后等待1分钟才能启动foo.service
,请在同一目录中创建一个foo.timer
文件,其内容如下:
[Timer]
OnBootSec=1min
重要的是,必须禁用该服务(因此它不会在启动时启动)并启用计时器,以使所有这些正常工作(这要感谢用户tride):
systemctl disable foo.service
systemctl enable foo.timer
您可以在此处找到许多其他选项和所需的所有信息:https://wiki.archlinux.org/index.php/Systemd/Timers
答案 2 :(得分:5)
我认为这个超级用户的答案是一个更好的答案。 https://superuser.com/a/573761/67952
但是,既然你没有使用前后的方法,你可以使用:
Type=idle
,man systemd.service
解释
闲置的行为非常类似于简单;但是,服务程序的实际执行会延迟,直到调度所有活动作业为止。这可以用于避免交错输出 shell服务与控制台上的状态输出。请注意,此类型仅用于改进控制台输出,它不能用作一般的单元排序工具,以及它的效果 服务类型需要5s超时,然后调用服务程序。
答案 3 :(得分:2)
与其编辑启动服务,不如将启动后延迟添加到它所依赖的服务上。像这样编辑cassandra.service
:
ExecStartPost=/bin/sleep 30
这样,增加的睡眠不应减慢重新启动的速度。
答案 4 :(得分:2)
结合@Ortomala Lokni和@rogerdpack的答案,另一种选择是在第一个启动/完成您正在等待的事情时使用依赖服务监视器。
例如,这是我如何使fail2ban服务等待Docker打开端口443(以便fail2ban的iptables条目优先于Docker的端口):
[Service]
ExecStartPre=/bin/bash -c '(while ! nc -z -v -w1 localhost 443 > /dev/null; do echo "Waiting for port 443 to open..."; sleep 2; done); sleep 2'
用第一个服务启动时失败(退出代码为非零)的命令简单地替换nc -z -v -w1 localhost 443
,并在启动后成功。
对于Cassandra,理想的情况是只有群集可用时才返回0的命令。
答案 5 :(得分:1)
进行此操作的systemd
方法是使过程以某种方式“回话”,例如打开套接字或发送notification(或退出父脚本)。当然,这并不总是那么简单,尤其是对于第三方的东西:|
您也许可以内联做类似的事情
ExecStart=/bin/bash -c '/bin/start_cassandra &; do_bash_loop_waiting_for_it_to_come_up_here'
或执行相同操作的脚本。或将do_bash_loop_waiting_for_it_to_come_up_here
放入ExecStartPost
或创建一个等待启动的helper .service,因此该助手服务依赖于cassandra,并等待其启动,然后您的其他进程就可以依赖该helper服务。
(也可能希望将默认值90倍增加TimeoutStartSec)
答案 6 :(得分:1)
我使用了 systemd 计时器来延迟服务,并且效果很好
int main()
{
long long n, i, j;
cin >> n;
int arr[] = {2,3,2,2,2,5,2};
int count[n];
int max = 1
for(i = 0; i < n; i++)
{
count[i] = 0;
}
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
if(arr[i] == arr[j])
{
count[i]++;
}
}
}
return 0;
}
查看计时器:cat /lib/systemd/system/foo.timer
[Unit]
Description=Wait some second before run foo
[Timer]
OnActiveSec=5sec
AccuracySec=1s
[Install]
WantedBy=timers.target
日志:
systemctl list-timers