Создание одноразового загрузочного скрипта - PullRequest
1 голос
/ 20 апреля 2019

В systemd мне нужно иметь возможность создавать сценарий, ставить его и выполнять при следующей загрузке, удаляя его после выполнения и удаляя службу.

Я создал несколько Perl для сборки файла модуля и создания сценария, который будет выполнять и очищать другие части. По какой-то причине я могу sudo systemctl start onetimerun, и соответствующая вещь происходит немедленно. Однако даже после sudo systemctl enable onetimerun он все равно не запускается при загрузке.

Это мой Perl-код, который должен создать соответствующую среду для запуска скрипта в / tmp / one-run-run / scripts /

#!/usr/local/bin/perl -w

my $unitFile = <<'END_MESSAGE';
[Unit]
Description=Ooe-time executor for ad-hoc boot scripts
After=basic.target rescue.service rescue.target

[Service]
Type=oneshot
ExecStart=/tmp/one-time-run/runwrangler.pl

[Install]
WantedBy=multi-user.target
END_MESSAGE

my $runScript = <<'END_MESSAGE';
#!/usr/local/bin/perl -w
use Data::Dumper;
my @scriptFiles = map { $_ =~ s/\s//gr } `for i in \$(ls /tmp/one-time-run/scripts/*.sh); do test -x "\$i" -a ! -d "\$i" && echo "\$i"; done;`;
print Dumper @scriptFiles;
foreach my $file (@scriptFiles) {
  if(!(system("$file"))) {
     print "Failed to run $file\n";
  }
  else {
    system("rm $file");
  }
}
system('rm /tmp/one-time-run/runwrangler.pl');
system('rm /run/systemd/system/onetimerun.service');
END_MESSAGE

unless(open UNITFILE, '>/run/systemd/system/onetimerun.service') {
  die "\nUnable to create unit file.\n";
}

print UNITFILE $unitFile;
close UNITFILE;

system('mkdir /tmp/one-time-run/');

unless(open WRANGLER, '>/tmp/one-time-run/runwrangler.pl') {
  die "\nUnable to create wrangler script.\n";
}

print WRANGLER $runScript;
close WRANGLER;

system('chmod +x /tmp/one-time-run/runwrangler.pl');
system('systemctl daemon-reload');
system('systemctl enable onetimerun');

Я ожидаю, что любой сценарий в / tmp / one-run-run / scripts / будет запущен и впоследствии удален перед удалением файла модуля и удаленного спорщика.

Вместо этого при загрузке ничего не происходит.

...