First you are not forced to use execline syntax to write your script. Execline is perfect for simple script but can be useless on complex one.
"Yeah, Eric, i saw that, but what the solution?"
You can use ANY languages that you want for your script. Bash, Python,Csh,Ash,Ruby WHATEVER :).
@ build field allow you to change this behavior. If you pick "auto" the script is considered as an execline one. If you pick custom you will be able to define the program to use to read the @ execute field.
So the syntax is
@ build = custom
@ shebang = "/usr/bin/foo"
@ execute = ( my list of command, my call of a script, what i need to do, what i want to do,.... )
So in your case
@ build = custom
@ shebang = "/usr/bin/bash -c"
@ execute =
(
exec 2>&1
for i in vmw_vmci vmmon vmnet; do
modprobe $i || echo modprobe failed && exit 0
done
vmware-networks --postinstall vmware-workstation,0,1
vmware-networks --start
vmware-usbarbitrator
)
Ok, now a little explanation. As you see the shebang give a -c options to bash. This is because you use it on oneshot (see
https://skarnet.org/software/s6-rc/s6-rc-compile.html oneshot section"). On longrun/classic the shebang would be "/usr/bin/bash".
So the shebang allow you to determine the program to use to interpret the syntax of the @ execute field.
The redirection made at the first line of the @ execute field allow you to send the error(stderr) to the standard output (stdout). This is done automatically when you use execline but you need to do it by yourself in other case.
But you can do some stuff like this
@ build = auto
@ execute = ( /home/marianarlt/myscript.sh )
This is really simple, make your complex script, make it executable and call it :)
Now, strictly speaking about your needs. You can use the /etc/modules-load.d directory to load modules. The modules-system service will parse this directory at boot time and it loads every modules found on a file.
For example create the file /etc/modules-load.d/vmware.conf containing this
vmw_vmci
vmmon
vmnet
and write a oneshot service like this
[main]
@ type = oneshot
@ name = vmware
@ description = "starts vmware modules"
@ user = ( root )
[start]
@ build = auto
@ execute =
(
ifelse {
if { vmware-networks --postinstall }
if { vmware-networks --start }
vmware-usbarbitrator
}
{ 66-echo vmware configured successfully }
if { 66-echo vmware unable to configure vmware }
exit 0
)
Or write your @ execute field with other interpreter :)
You have right, the boot process should not fail as far as the boot service set is finished successfully. Every followed tree (like root) should not crash the boot if something go wrong on it. I think from a little while now about it and i think i found the solution, be patient please , this behavior will change and the near future.